11

在深入了解 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?

4

2 回答 2

18

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

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

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

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

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

于 2012-09-04T16:01:41.223 回答
6

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

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

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

于 2012-09-04T16:01:15.807 回答