Re[25]: Не нужность super return (нелок. возврата) [рассм. п
От: FDSC Россия consp11.github.io блог
Дата: 09.09.06 14:02
Оценка:
Здравствуйте, pavel74, Вы писали:

P>Здравствуйте, FDSC, Вы писали:



FDS>>Банально

FDS>>public static void ForEach<T>(T root, Action<T> action)
FDS>>  where T: IRecursible<T>
FDS>>{
FDS>>  action(root);
FDS>>  CRT Child = root.LoadFromDataBaseChildAndLock();
FDS>>  foreach(T Child in root)
FDS>>{

FDS>>      ForEach(Child, action);
FDS>>}
FDS>>Child.Unlock();
FDS>>}
S>>>


FDS>>и уже ошибка


P>ну дак обложить обработкой ошибок, тем более если передан внешний блок кода, то существует вероятность что там может возникнуть эксепшн. А нелокальный возврат это фактически "особый" эксепшен.


Т.е. вы предлагаете примерно так:

FDS>>public static void ForEach<T>(T root, Action<T> action)
FDS>>  where T: IRecursible<T>
FDS>>{
try{
FDS>>  action(root);
FDS>>  CRT Child = root.LoadFromDataBaseChildAndLock();
FDS>>  foreach(T Child in root)
FDS>>{

FDS>>      ForEach(Child, action);
FDS>>}
FDS>>Child.Unlock();
}
cath(super return event E)
{
  Child.Unlock();
  super return E;
}
FDS>>}
S>>>


Причём этот super return должен вызываться в том же контексте, что и в переданном блоке.

Да посмотрите же, что это?! Да ведь наш super return превратился в обыкновенный return, возвращающий управление ВЫЗЫВАЮЩЕЙ функции! Ну и зачем он тогда нужен? Не проще и быстрее его реализовать как return?

public static ResultAction ForEach<T>(T root, Action<T> action)
  where T: IRecursible<T>
{
    ResultAction RA = action(root);
       if (RA.isExecuted)
          return RA;

  CRT Child = root.LoadFromDataBaseChildAndLock();

  foreach(T Child in root)
  {
      RA = ForEach(Child, action);
        if (RA.isExecuted)
          break;
  }
  Child.Unlock();
  return RA;
}


И что, это намного хуже и сложнее? И наверняка быстрее работает, чем перехват повторно вызывающихся нелокальных возвратов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.