匿名方法(C#2.0)和lambdaexpression式(C#3.0)之间有什么区别?
C#2.0的匿名方法和C#3.0的lambdaexpression式之间有什么区别?
匿名方法的MSDN页面解释了它
在2.0之前的C#版本中,声明委托的唯一方法是使用命名方法。 C#2.0引入了匿名方法,并且在C#3.0及更高版本中,lambdaexpression式取代匿名方法作为编写内联代码的首选方式。 但是,本主题中有关匿名方法的信息也适用于lambdaexpression式。 有一种情况是匿名方法提供了在lambdaexpression式中找不到的function。 匿名方法使您可以省略参数列表,这意味着可以将匿名方法转换为具有各种签名的委托。 这是不可能的lambdaexpression式。 有关lambdaexpression式的更多信息,请参阅Lambdaexpression式(C#编程指南)。
关于lambdaexpression式 :
lambdaexpression式是一个可以包含expression式和语句的匿名函数,可以用来创build委托或expression式树types。 所有的lambdaexpression式都使用lambda运算符=>,读作“去”。 lambda运算符的左侧指定input参数(如果有的话),右侧保存expression式或语句块。 lambdaexpression式x => x * x被读取为“x转到x次x”。 这个expression式可以如下分配给委托types:
- 匿名方法基本上是没有名字的函数,可以创build闭包。
- Lambdaexpression式是可转换为匿名方法和expression式树的构造,并遵循比匿名方法更复杂的types推断规则。
Eric Lippert(C#语言devise者)在他的博客中解释了一些或多或less的细微差别:
- Lambdaexpression式与匿名方法,第一部分
- Lambdaexpression式与匿名方法,第二部分
- Lambdaexpression式与匿名方法,第三部分
- Lambdaexpression式与匿名方法,第四部分
- Lambdaexpression式与匿名方法,第五部分
- 可以将Lambdaexpression式转换为委托或expression式树(有一些限制); 匿名方法只能转换为委托
- Lambdaexpression式允许对参数进行types推断:
- Lambdaexpression式允许将主体截断为仅用于expression式(返回值)或单个语句(在其他情况下)而不用大括号。
- Lambdaexpression式允许将参数列表缩短为仅当参数名称可以被推断时以及只有一个参数
- 匿名方法允许参数列表在主体中没有被使用时被完全省略,并且不会导致歧义
我相信最后一点是匿名方法相对于lambdaexpression式的唯一好处。 尽pipe创build一个没有任何操作的字段事件是很有用的:
public event EventHandler Click = delegate{};
首先,方便:lambda更容易阅读和写作。
其次,expression式:lambdas可以被编译成委托或expression式树( Expression<T>
用于某些委托typesT,例如Func<int,bool>
)。 expression式树更令人兴奋,因为它是LINQ处理数据存储的关键。
Func<int,bool> isEven = i => i % 2 == 0; Expression<Func<int,bool>> isEven = i => i % 2 == 0;
请注意,具有语句正文的lambdaexpression式只能编译为委托,而不是Expression
s:
Action a = () => { Console.WriteLine(obj.ToString()); };