Cod*_*yer 42 c# methods expression
C#2.0的匿名方法和C#3.0的lambda表达式有什么区别?
Bri*_*ndy 29
在2.0之前的C#版本中,声明委托的唯一方法是使用命名方法.C#2.0引入了匿名方法,在C#3.0及更高版本中,lambda表达式取代了匿名方法作为编写内联代码的首选方法.但是,本主题中有关匿名方法的信息也适用于lambda表达式.有一种情况是匿名方法提供lambda表达式中没有的功能.匿名方法使您可以省略参数列表,这意味着可以将匿名方法转换为具有各种签名的委托.lambda表达式无法做到这一点.有关lambda表达式的更多信息,请参阅Lambda表达式(C#编程指南).
lambda表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型.所有lambda表达式都使用lambda operator =>,它被读作"转到".lambda运算符的左侧指定输入参数(如果有),右侧包含表达式或语句块.lambda表达式x => x*x被读为"x转到x乘以x".可以将此表达式分配给委托类型,如下所示:
Jon*_*eet 29
我相信最后一点是匿名方法对lambdas的唯一好处.尽管如此,使用无操作订阅创建类似字段的事件非常有用:
public event EventHandler Click = delegate{};
Run Code Online (Sandbox Code Playgroud)
Pop*_*lin 23
Eric Lippert(C#语言设计师)在他的博客中解释了或多或少微妙差异的范围:
Mar*_*ell 13
首先,方便: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;
Run Code Online (Sandbox Code Playgroud)
请注意,带有语句体的lambda表达式只能编译为委托,而不能编译为Expressions:
Action a = () => { Console.WriteLine(obj.ToString()); };
Run Code Online (Sandbox Code Playgroud)