什么';s匿名方法(C#2.0)和lambda表达式(C#3.0)之间的区别

本文关键字:lambda C#3 区别 之间 表达式 C#2 方法 什么 | 更新日期: 2023-09-27 17:47:47

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

什么';s匿名方法(C#2.0)和lambda表达式(C#3.0)之间的区别

  1. Lambda表达式可以转换为委托或表达式树(有一些限制);匿名方法只能转换为委托
  2. Lambda表达式允许对参数进行类型推断:
  3. Lambda表达式允许将正文截断为仅一个表达式(返回值)或不带大括号的单个语句(在其他情况下)
  4. 当可以推断类型并且只有一个参数时,Lambda表达式允许将参数列表缩短为仅参数名称
  5. 匿名方法允许参数列表在正文中未使用时完全省略,并且不会导致歧义

最后一点是匿名方法相对于lambdas的唯一好处,我相信。创建一个没有操作订阅的类似字段的事件是有用的:

public event EventHandler Click = delegate{};

关于匿名方法的MSDN页面解释了

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

关于lambda表达式:

lambda表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型。所有lambda表达式都使用lambda运算符=>,该运算符读作"gosto"。lambda运算符的左侧指定输入参数(如果有的话),右侧保存表达式或语句块。lambda表达式x=>x*x读取为"x到x乘以x"。此表达式可以分配给如下委托类型:

  1. 匿名方法基本上是没有名称的函数,可以创建闭包
  2. Lambda表达式是可转换为匿名方法和表达式树的构造,并且遵循比匿名方法更复杂的类型推理规则

Eric Lippert(C#语言设计师)在他的博客中解释了或多或少的细微差异

  • Lambda表达式与匿名方法(上)
  • Lambda表达式与匿名方法,第二部分
  • Lambda表达式与匿名方法,第三部分
  • Lambda表达式与匿名方法,第四部分
  • Lambda表达式与匿名方法,第五部分

首先,方便:lambda更容易读写。

其次,表达式:lambdas可以编译为委托,表达式树(对于某些委托类型T,如Func<int,bool>,为Expression<T>)。表达式树更令人兴奋,因为它是LINQ处理外数据存储的关键。

Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;

请注意,带有语句体的lambda表达式只能编译为委托,而不能编译为Expression s:

Action a = () => { Console.WriteLine(obj.ToString()); };