匿名方法(C#2.0)和lambda表达式(C#3.0)之间有什么区别?

时间:2008-10-16 12:38:33

标签: c# methods expression

C#2.0的 匿名方法 和C#3.0的 lambda表达式 之间有什么区别。?< / p>

4 个答案:

答案 0 :(得分:28)

The MSDN page on anonymous methods explains it

  

在2.0之前的C#版本中,唯一的   声明委托的方式是使用   命名方法。 C#2.0介绍   匿名方法和C#3.0和   后来,lambda表达式取而代之   匿名方法作为首选方式   编写内联代码。然而   有关匿名方法的信息   这个主题也适用于lambda   表达式。有一个案例   匿名方法提供的   lambda中找不到的功能   表达式。匿名方法启用   你要省略参数列表,和   这意味着一个匿名方法   可以转换为具有的代表   各种签名。这不是   可以使用lambda表达式。对于   有关的更多信息   lambda表达式,请参阅Lambda   表达式(C#编程指南)。

And regarding lambda expressions

  

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

答案 1 :(得分:28)

  1. Lambda表达式可以转换为委托或表达式树(有一些限制);匿名方法只能转换为委托
  2. Lambda表达式允许对参数进行类型推断:
  3. Lambda表达式允许将主体截断为仅包含表达式(以返回值)或单个语句(在其他情况下)而不使用大括号。
  4. Lambda表达式允许在推断类型时以及只有一个参数时将参数列表缩短为参数名称
  5. 匿名方法允许参数列表在体内未使用时完全省略,并且不会导致歧义
  6. 最后一点是匿名方法对lambdas的唯一好处,我相信。使用无操作订阅创建类似字段的事件非常有用:

    public event EventHandler Click = delegate{};
    

答案 2 :(得分:23)

  1. 匿名方法基本上是没有名称的函数,可以创建闭包。
  2. Lambda表达式是可以转换为匿名方法和表达式树的构造,并且遵循比匿名方法更复杂的类型推断规则。
  3. Eric Lippert(C#语言设计师)在他的博客中解释了或多或少微妙差异的范围:

答案 3 :(得分:13)

首先,方便:lambdas更容易阅读和写作。

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

Func<int,bool>

请注意,带有语句体的lambda表达式只能编译为委托,而不能编译为Func<int,bool> isEven = i => i % 2 == 0; Expression<Func<int,bool>> isEven = i => i % 2 == 0; s:

Expression