C#2.0的 匿名方法 和C#3.0的 lambda表达式 之间有什么区别。?< / p>
答案 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)
最后一点是匿名方法对lambdas的唯一好处,我相信。使用无操作订阅创建类似字段的事件非常有用:
public event EventHandler Click = delegate{};
答案 2 :(得分:23)
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