Func<>之间的差异with delegate和lambda表达式

时间:2012-09-04 15:59:47

标签: c# delegates lambda func

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

Func<string, int> giveLength = (text => text.Length);

Func<string, int> giveLength = delegate(string text) { return text.Length; };

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

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

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

2 个答案:

答案 0 :(得分:16)

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

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

匿名方法允许您在不关心的情况下删除参数列表。例如:

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

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

答案 1 :(得分:6)

  

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

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

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