Lambda表达式和匿名方法的区别 - C#

10

重复: delegate关键字与lambda符号

我知道匿名方法可以用来定义委托并编写内联函数。那么使用Lambda表达式有什么不同呢?

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

编辑: 此外,似乎为了使用匿名或Lambda表达式,需要为类型创建扩展方法?

4个回答

16
一个 lambda 表达式仅仅是一个匿名方法的快捷语法。匿名方法长这样:
delegate(params) {method body}
等效的lambda表达式如下:
params => method body

简而言之,所有的lambda表达式都是匿名方法,但是可以有一个不使用lambda语法(与上面的第一个示例类似)的匿名方法。希望这个回答对你有所帮助!


+1,但是 lambda 表达式不就是在重新发明轮子吗(而且我认为匿名方法更有意义)? - Steven Evers
Lambda表达式不能有返回值吗?而匿名方法可以吗? - Sasha
1
SnOrfus:是的,它们做相同的事情,所以你是对的,这只是语法偏好的问题。 Sasha:lambda表达式和匿名方法都可以有返回值。 - Adam Alexander
1
Lambda表达式通过语法快捷方式和类型推断,使得使用匿名委托更加简洁。i = l.Count(delegate(string x) { return x.Length == 2; }); i = l.Count(x => x.Length == 2); - Mark
4
Lambda表达式使用隐式类型,因此"(x, y) => x + y;"比"delegate(int x, int y) { return x + y; }"更加简洁。当Lambda表达式有助于提高可读性时,请使用它们,而匿名委托则在合适的情况下使用。 - Michael Meadows

6

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

以下结构编译:

            Func<int> exp1 = () => 1;
            Func<int> exp2 = () => { return 1; };
            Func<int> exp3 = delegate { return 1; };
            Expression<Func<int>> exp4 = () => 1;

以下不是

关于IT技术的内容
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;

你实际上做的是相同的事情,但匿名委托在这里显然更好。


6
Lambda表达式可以转换为表达式树,而匿名委托无法。

4

实际上并不是。这两个功能本质上是相同的,只是语法结构不同而已。总体趋势似乎是从C# 2.0匿名方法语法向lambda风格语法转变,适用于匿名表达式和函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接