虽然使用针对应用程序的.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 }
相同模式的方式吗?
答案 0 :(得分:5)
原因似乎是有一个函数可以处理和记录可能失败的操作中的错误:bestEffort
。委托用于包装可能失败的操作并将其传递给bestEffort
函数。
答案 1 :(得分:1)
委托可以作为参数传递给不同的函数。然后接受函数不必知道哪个类暴露它的函数在哪里。它可以调用它并使用它从常规方法中获得的结果。 lambdas然后表达式树是围绕代表建立的。无法在运行时评估常规函数,这可以通过使用委托创建表达式树来实现。您已经回答了具体问题。所以我只想在问题上加上一般的想法。