46

C# 2.0 的匿名方法和 C# 3.0 的lambda 表达式有什么区别?

4

4 回答 4

31

关于匿名方法的 MSDN 页面对此进行了解释

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法,在 C# 3.0 及更高版本中,lambda 表达式取代了匿名方法,成为编写内联代码的首选方式。但是,本主题中有关匿名方法的信息也适用于 lambda 表达式。在一种情况下,匿名方法提供了 lambda 表达式中没有的功能。匿名方法使您可以省略参数列表,这意味着可以将匿名方法转换为具有各种签名的委托。这对于 lambda 表达式是不可能的。有关 lambda 表达式的详细信息,请参阅 Lambda 表达式(C# 编程指南)。

关于 lambda 表达式

lambda 表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型。所有 lambda 表达式都使用 lambda 运算符 =>,读作“goes to”。lambda 运算符的左侧指定输入参数(如果有),右侧保存表达式或语句块。lambda 表达式 x => x * x 读作“x 乘以 x”。可以将此表达式分配给委托类型,如下所示:

于 2008-10-16T12:41:05.557 回答
31
  1. Lambda expressions can be converted to delegates or expression trees (with some restrictions); anonymous methods can only be converted to delegates
  2. Lambda expressions allow type inference on parameters:
  3. Lambda expressions allow the body to be truncated to just an expression (to return a value) or single statement (in other cases) without braces.
  4. Lambda expressions allow the parameter list to be shortened to just the parameter name when the type can be inferred and when there's only a single parameter
  5. Anonymous methods allow the parameter list to be omitted entirely when it's not used within the body and it doesn't lead to ambiguity

The last point is the only benefit of anonymous methods over lambdas, I believe. It's useful to create a field-like event with a no-op subscription though:

public event EventHandler Click = delegate{};
于 2008-10-16T14:29:16.183 回答
26
  1. 匿名方法基本上是没有名称的函数,具有创建闭包的能力。
  2. Lambda 表达式是可转换为匿名方法和表达式树的构造,并且遵循比匿名方法更复杂的类型推断规则。

Eric Lippert(C# 语言设计师)在他的博客中解释了或多或少细微差别的范围:

于 2008-10-16T12:59:34.803 回答
14

首先,方便:lambda 更容易读写。

其次,表达式:lambda 可以编译为委托表达式树(Expression<T>对于某些委托类型 T,例如Func<int,bool>)。表达式树更令人兴奋,因为它是 LINQ 到进程外数据存储的关键。

Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;

请注意,带有语句体的 lambda 表达式只能编译为委托,而不是Expressions:

Action a = () => { Console.WriteLine(obj.ToString()); };
于 2008-10-16T12:50:29.923 回答