这个代表用法的目的是什么?

时间:2010-12-22 16:14:30

标签: c# .net delegates

虽然使用针对应用程序的.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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

委托可以作为参数传递给不同的函数。然后接受函数不必知道哪个类暴露它的函数在哪里。它可以调用它并使用它从常规方法中获得的结果。 lambdas然后表达式树是围绕代表建立的。无法在运行时评估常规函数,这可以通过使用委托创建表达式树来实现。您已经回答了具体问题。所以我只想在问题上加上一般的想法。