Здравствуйте, 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;
}
И что, это намного хуже и сложнее? И наверняка быстрее работает, чем перехват повторно вызывающихся нелокальных возвратов.