在使用 .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 } 经常使用,这只是一种包装相同模式的方法吗?

最佳答案

原因似乎是只有一个函数来处理和记录可能失败的操作中的错误: bestEffort 。委托(delegate)用于包装可能失败的操作并将其传递给 bestEffort 函数。

关于c# - 这个委托(delegate)使用的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4511157/

10-12 21:06