C#Lambda | Method(Callback)和Method(()=> Callback())之间的区别

时间:2017-08-01 09:59:21

标签: c# lambda

我的问题涉及

之间的执行差异
void Method1(Action callback)
{
    Method2(callback);
}

void Method3(Action callback)
{
    Method4(() => callback());
}

使用第一种方法时,是否会在此时调用回调Action。或者,执行明智,两种方法之间没有区别吗?

这两种方法之间是否存在真正的差异?

3 个答案:

答案 0 :(得分:2)

有两个小差异:

  1. 如果回调中发生错误,堆栈跟踪将在第二个示例中包含lambda。

  2. 使用反射时,Target实例的MethodAction字段会有所不同。

答案 1 :(得分:1)

  

这两种方法之间是否存在真正的差异?

后者在callstack上放了一个额外的(匿名)方法,但除此之外几乎没有任何区别

主要区别在于第二种方法允许您在Method3Method4不共享Action

的同一签名的情况下传递参数
void Method3(Action<string,string> callback)
{
    Method4(() => callback(arg1,arg2));
}

答案 2 :(得分:0)

我会说一个大的。在第一个中,您只是将一个委托传递给另一个函数,在第二个函数中,您正在创建一个带有闭包变量的新委托,该变量保存第一个委托,该委托将在第一个委托后执行。信不信由你在原始类中创建了一个名为<>c_DisplayClass1的子类(有关更多信息,请查看this)。查看此处发生的事情的一种简单方法是在调试模式下查看类似

的表达式树
Action a = () => Console.WriteLine("A");
Expression<Action> exp = () => a();

由于Action只是一个代表无效的Action()&#39;委托是一种继承自Delegate的类型,它的工作原理相同。