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

Bob*_*ith 10 .net c#

重复: 委托关键字与lambda表示法

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

我想我什么时候使用什么有点困惑.

编辑:另外,似乎要使用匿名或lambdas,需要一个类型的扩展方法?

Ada*_*der 15

lambda表达式只是匿名方法的快捷语法.匿名方法如下所示:

delegate(params) {method body}
Run Code Online (Sandbox Code Playgroud)

等效的lambda表达式如下所示:

params => method body
Run Code Online (Sandbox Code Playgroud)

简而言之,所有lambda表达式都是匿名方法,但是有可能有一个不是用lambda语法编写的匿名方法(就像上面的第一个例子).希望这有用!

  • lambdas使用隐含的类型,所以"(x,y)=> x + y;" 比"delegate(int x,int y){return x + y;}"更简洁.当它们提升可读性时使用lambdas,当它们有意义时使用匿名委托. (4认同)

bdu*_*kes 6

Lambda表达式可以转换为表达式树,而匿名委托则不能.


Val*_*zub 5

只有没有方法体的lambda表达式才能转换为表达式树

下面的结构编译:

            Func<int> exp1 = () => 1;
            Func<int> exp2 = () => { return 1; };
            Func<int> exp3 = delegate { return 1; };
            Expression<Func<int>> exp4 = () => 1;
Run Code Online (Sandbox Code Playgroud)

而继做

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body
Run Code Online (Sandbox Code Playgroud)

所以即使在非常高级的水平上也存在差异(Jon Skeet在这里指出病态差异的例子)

另一个区别是,如果您不打算在方法体内使用它们,则可以创建没有参数列表的匿名委托,使用lambda总是必须提供参数.

以下两行证明了差异

Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
Run Code Online (Sandbox Code Playgroud)

你基本上做同样的事情,但匿名代表在这里看起来更好.


Jar*_*Par 4

不是真的没有。它们本质上是完全相同的功能,但具有不同的语法结构。不过,总体转变似乎是从 C# 2.0 匿名方法语法转向匿名表达式和函数的 lambda 样式语法。