Какова цель использования этого делегата? - PullRequest
4 голосов
/ 22 декабря 2010

Пока я искал код с помощью .NET Reflector для приложения, для которого у меня нет исходного кода, я нашел это:

if (DeleteDisks)
{
  using (List<XenRef<VDI>>.Enumerator enumerator3 = list.GetEnumerator())
  {
    MethodInvoker invoker2 = null;
    XenRef<VDI> vdiRef;
    while (enumerator3.MoveNext())
    {
      vdiRef = enumerator3.Current;
      if (invoker2 == null)
      {
        //
        // Why do this?
        //
        invoker2 = delegate {
          VDI.destroy(session, vdiRef.opaque_ref);
        };
      }
      bestEffort(ref caught, invoker2);
    }
  }
}
if (caught != null)
{
  throw caught;
}


private static void bestEffort(ref Exception caught, MethodInvoker func)
{
  try
  {
    func();
  }
  catch (Exception exception)
  {
    log.Error(exception, exception);
    if (caught == null)
    {
      caught = exception;
    }
  }
}

Почему бы не позвонить VDI.destroy() напрямую? Это просто способ обернуть один и тот же шаблон try { do something } catch { log error }, если он часто используется?

Ответы [ 2 ]

5 голосов
/ 22 декабря 2010

Причина, по-видимому, заключается в наличии единственной функции для обработки и регистрации ошибок в операциях, которые могут завершиться с ошибкой: bestEffort.Делегат используется для переноса действия, которое может завершиться неудачей, и передачи его в функцию bestEffort.

1 голос
/ 22 декабря 2010

Делегат может быть передан в качестве аргумента другой функции.Тогда принимающая функция не должна знать, где находится эта функция, какой класс ее предоставляет.Он может вызывать его и использовать его результаты, как если бы это был обычный метод.Лямбды и затем деревья выражений строятся вокруг делегатов.Обычные функции не могут быть оценены во время выполнения, что возможно при создании дерева выражений с делегатом.Вы уже ответили на конкретный вопрос.Поэтому я просто добавлю общую идею к вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...