C#2.0的匿名方法和C#3.0的lambda表达式有什么区别?
匿名方法的MSDN页面解释了它
在2.0之前的C#版本中,声明委托的唯一方法是使用命名方法.C#2.0引入了匿名方法,在C#3.0及更高版本中,lambda表达式取代了匿名方法作为编写内联代码的首选方法.但是,本主题中有关匿名方法的信息也适用于lambda表达式.有一种情况是匿名方法提供lambda表达式中没有的功能.匿名方法使您可以省略参数列表,这意味着可以将匿名方法转换为具有各种签名的委托.lambda表达式无法做到这一点.有关lambda表达式的更多信息,请参阅Lambda表达式(C#编程指南).
关于lambda表达式:
lambda表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型.所有lambda表达式都使用lambda operator =>,它被读作"转到".lambda运算符的左侧指定输入参数(如果有),右侧包含表达式或语句块.lambda表达式x => x*x被读为"x转到x乘以x".可以将此表达式分配给委托类型,如下所示:
Lambda表达式可以转换为委托或表达式树(有一些限制); 匿名方法只能转换为委托
Lambda表达式允许对参数进行类型推断:
Lambda表达式允许将主体截断为仅包含表达式(以返回值)或单个语句(在其他情况下)而不使用大括号.
Lambda表达式允许在推断类型时以及只有一个参数时将参数列表缩短为参数名称
匿名方法允许参数列表在体内未使用时完全省略,并且不会导致歧义
我相信最后一点是匿名方法对lambdas的唯一好处.尽管如此,使用无操作订阅创建类似字段的事件非常有用:
public event EventHandler Click = delegate{};
匿名方法基本上是没有名称的函数,能够创建闭包.
Lambda表达式是可以转换为匿名方法和表达式树的构造,并且遵循比匿名方法更复杂的类型推断规则.
Eric Lippert(C#语言设计师)在他的博客中解释了或多或少微妙差异的范围:
Lambda表达式与匿名方法,第一部分
Lambda表达式与匿名方法,第二部分
Lambda表达式与匿名方法,第三部分
Lambda表达式与匿名方法,第四部分
Lambda表达式与匿名方法,第五部分
首先,方便:lambda更易于阅读和书写.
第二,表达式:lambda表达式可被编译以任一代表,或一个表达式树(Expression
对于一些代表类型T,如Func
).表达式树更令人兴奋,因为它是LINQ到进程外数据存储的关键.
FuncisEven = i => i % 2 == 0; Expression > isEven = i => i % 2 == 0;
请注意,带有语句体的lambda表达式只能编译为委托,而不能编译为Expression
s:
Action a = () => { Console.WriteLine(obj.ToString()); };