Lambda表达式与匿名方法

26

我想知道它们之间的区别。目前我正在学习这个东西,但对我来说它们似乎是完全相同的:

delegate void X();

X instanceOfX;

instanceOfX = delegate() { code };

instanceOfX = () => { code };

如果Lambda表达式是较新的语法,那我是否应该只使用Lambda表达式而忘记匿名方法?


3
考虑语言的演变。在C# 1中,我们有委托。在C# 2中,他们添加了匿名方法。C# 3添加了Lambda表达式。这些都是完成类似任务的更简单的方法。要了解更多关于演变的内容,我建议您查阅《深入浅出C#》这本书。 - Anthony Pegram
2个回答

19

7
它们有什么特别之处? - recursive
它们有什么特别之处? - lojol
2
@recursive 首先,一个主要的区别是单行Lambda表达式可以分配给表达式树,而匿名方法则不行。 - Doctor Jones
我更喜欢使用匿名方法,我并不总是使用LINQ,否则我喜欢使用List的FindAll方法。 - BlaShadow

4
唯一的区别是 lambda 可以轻松转换为 Expression<Func<void>>。委托只是方法/闭包,但是 lambda 也可以分解为表达式树:
Expression<Func<int, int>> expr = x => x*2; // Expression tree
Func<int, int> fun = x => x*2;              // Function
delegate int MyDelegate(int x);             // Delegate
MyDelegate del = x => x*2;                  // Same as Function and Delegate

1
请注意,仅对表达式lambda而非语句lambda进行此操作。 - CodesInChaos
4
请注意,“Delegate”作为委托类型的名称非常糟糕,因为它很容易与其基类System.Delegate混淆。 - Eric Lippert
4
抱歉,我今天早上还在喝咖啡,实在想不出其他的名称了。 - kelloti

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