重复: delegate keyword vs. lambda notation
我理解匿名方法可用于定义委托和编写内联函数。使用Lambda表达式与此有何不同?
我想我什么时候对使用什么感到困惑。
修改: 此外,似乎要使用匿名或lambdas,需要一个类型的扩展方法?
答案 0 :(得分:15)
lambda表达式只是匿名方法的快捷语法。匿名方法如下所示:
delegate(params) {method body}
等效的lambda表达式如下所示:
params => method body
简而言之,所有lambda表达式都是匿名方法,但有可能有一个不是用lambda语法编写的匿名方法(如上面的第一个例子)。希望这有用!
答案 1 :(得分:6)
Lambda表达式可以转换为表达式树,而匿名委托则不能。
答案 2 :(得分:5)
只有没有方法体的lambda表达式才能转换为表达式树
以下构造执行编译:
Func<int> exp1 = () => 1;
Func<int> exp2 = () => { return 1; };
Func<int> exp3 = delegate { return 1; };
Expression<Func<int>> exp4 = () => 1;
然后执行不
Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body
所以即使在非常高级的水平上也存在差异(Jon Skeet在此指出sick difference example)
另一个不同之处在于,如果您不打算在方法体内使用它们,则可以创建没有参数列表的匿名委托,而lambda总是必须提供参数。
以下两行显示差异
Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
你基本上做同样的事情,但匿名代表在这里看起来更好。
答案 3 :(得分:4)
不是真的没有。它们本质上是具有不同语法结构的完全相同的特征。对于匿名表达式和函数,一般转换似乎远离C#2.0匿名方法语法朝向lambda样式语法。
答案 4 :(得分:1)
以下是一个很好的解释:C#: delegate keyword vs. lambda notation