在使用 .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/