lambda表达式和匿名方法之间的区别 - C#

时间:2009-04-17 16:52:05

标签: c# .net

重复: delegate keyword vs. lambda notation

我理解匿名方法可用于定义委托和编写内联函数。使用Lambda表达式与此有何不同?

我想我什么时候对使用什么感到困惑。

修改: 此外,似乎要使用匿名或lambdas,需要一个类型的扩展方法?

5 个答案:

答案 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