C# 2.0中匿名方法和C# 3.0中的lambda表达式有什么区别?
C# 2.0中匿名方法和C# 3.0中的lambda表达式有什么区别?
我认为,最后一点是匿名方法比Lambda表达式更具优势的唯一方面。它可用于创建一个无操作订阅的类似字段的事件:
public event EventHandler Click = delegate{};
在C# 2.0之前的版本中,声明委托的唯一方式是使用命名方法。C# 2.0引入了匿名方法,在C# 3.0及更高版本中,Lambda表达式取代匿名方法成为编写内联代码的首选方式。但是,在本主题中关于匿名方法的信息同样适用于Lambda表达式。有一种情况下匿名方法提供了Lambda表达式没有的功能。匿名方法使您可以省略参数列表,这意味着匿名方法可以转换为具有各种签名的委托。Lambda表达式无法做到这一点。有关Lambda表达式的更多信息,请参阅Lambda表达式 (C# 编程指南)。
Lambda表达式是一个可以包含表达式和语句的匿名函数,并可用于创建委托或表达式树类型。所有Lambda表达式都使用lambda运算符"=>"(读作"goes to")。Lambda运算符的左侧指定输入参数(如果有的话),右侧包含表达式或语句块。Lambda表达式"x => x * x"读作"x goes to x times x"。可以将此表达式分配给委托类型,如下所示:
Eric Lippert(C# 语言设计师)在他的博客中解释了这些相对微妙的差异:
首先,便利性:lambda表达式更易于阅读和编写。
其次,表达式:lambda表达式可以编译为委托或表达式树(例如,对于某些委托类型T,如Func<int,bool>
,可以编译为Expression<T>
)。表达式树更加令人兴奋,因为它是LINQ到外部数据存储的关键。
Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;
Action a = () => { Console.WriteLine(obj.ToString()); };
(x,y) => {}
- Basicx => x.Length
进行比较。你的例子来自第2点,“Lambda表达式允许对参数进行类型推断”。 - Jon Skeet