Func 与委托和lambda表达式之间的区别

在深化自己更高级的C#function的同时,我遇到了一些代码,我并不完全知道它的区别。 这是关于这两行:

Func giveLength = (text => text.Length); 

 Func giveLength = delegate(string text) { return text.Length; }; 

这可以以相同的方式使用:

 Console.WriteLine(giveLength("A random string.")); 

所以基本上……这两条线有什么区别? 这些行是否编译为相同的CIL?

基本上它们是一样的。 它们都是C#规范术语中的匿名函数

Lambda表达式通常更简洁,也可以转换为表达式树 ,这对于进程外LINQ至关重要。

如果您不在意,匿名方法允许您删除参数列表。 例如:

 EventHandler handler = delegate { Console.WriteLine("Sender and args don't matter"); }; 

鉴于后一点很少需要,匿名方法正在成为现代C#中的濒危物种。 Lambda表达式更常见。

所以基本上……这两条线有什么区别? 这些行是否编译为相同的CIL?

只有两种不同的方式来编写相同的东西。 lambda语法更新,更简洁,但它们做同样的事情(在这种情况下)。

请注意,lambdas( => syntax)也可用于形成Expression Lambdas ,您可以在其中创建表达式树而不是委托。 这很好,因为您可以使用相同的语法,无论您使用的是LINQ to Objects(基于FuncFunc )还是LINQ to Entities(使用IQueryable和表达式树)。