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

Mem*_*sen 11 c# lambda delegates func

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

Func<string, int> giveLength = (text => text.Length);
Run Code Online (Sandbox Code Playgroud)

Func<string, int> giveLength = delegate(string text) { return text.Length; };
Run Code Online (Sandbox Code Playgroud)

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

Console.WriteLine(giveLength("A random string."));
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 17

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

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

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

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

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

  • @memetolsen:缺点是,如果你在这里阅读了足够的答案,你将会阅读本书的大部分内容;) (3认同)
  • 我认为我的赞成票中有1/3是你的答案.但是,我宁愿在业余时间阅读这本书,而不是阅读22,284个答案:) (2认同)

Ree*_*sey 6

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

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

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