var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });
我认为 sort2 更明确,但 sort 1 更短。除此之外,我真的不知道有什么区别。这样做的推荐方法是什么?
var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });
我认为 sort2 更明确,但 sort 1 更短。除此之外,我真的不知道有什么区别。这样做的推荐方法是什么?
Lambda 表达式在所有情况下都比匿名方法更好(IMO),除非您不关心参数,在这种情况下有一个很好的捷径:
// Lambda expression has to specify parameter types
EventHandler x = (sender, args) => Console.WriteLine("Hi");
// Anonymous method can ignore them
EventHandler x = delegate { Console.WriteLine("Hi"); };
Lambda 表达式还有两个“问题”IMO:
无参数 lambda 表达式的语法有些笨拙:
() => stuff
在可能的情况下,我更喜欢 lambda 语法 (sort1)。我只在需要的地方使用更详细的语法。我认为额外的东西非生产性代码只会妨碍理解我在写什么。
编辑:当然,除非我正在开发 .NET 2.0 应用程序,否则您不能使用 lambda 语法。然后,我很高兴我至少有匿名方法。
我发现这取决于场景,因为重要的方面是确保您的代码的意图为未来的维护者提供了良好的文档记录。因此,有时 lambda 效果最好,但有时匿名方法是更好的选择。需要更多参数的 lambdas 的问题在于语法开始看起来很混乱,因此使用匿名方法委托语法有时会很有用,以提供更易于识别的结构。
在您给出的示例中,lambda 是更好的选择,因为它清晰简洁;但是,当声明内联事件处理程序时,匿名方法可能会提供更好的解决方案(关于可维护性)。
很少有(我只能想到一个最重要的)我喜欢委托语法而不是 lambda 表达式......
public event Action Evt = delegate {};
public event Action Evt = () => { };
... 例如。其余时间,委托只是妨碍。根据乔恩的评论...
public event EventHandler Evt = delegate {};
public event EventHandler Evt = (s,ea) => { };
据我所知,这两种方法都会生成完全相同的 IL 代码(至少在这个例子中),所以这真的是一个品味问题。我经常认为 lambda 味道更好。
sort1 - 我认为 Lambdas 是编写匿名方法的首选方式
我更喜欢 lambda 表达式,因为它们提供了最简洁的语法,并且类似于函数式编程语言中的 lambda,而这种构造最初来自于函数式编程语言。当表达式包含多个语句或非功能构造时,我将使用delegate
. 无参数、多行或显式类型的 lambda 表达式可能看起来有些奇怪,因此失去了它们的主要优势(更具可读性)。
g = (x => 2 * f(x) + 1); // Nice functional one-liner
// but
action = delegate (int arg) {
SendSystemMessage(arg);
Console.WriteLine("Got value: {0}", arg);
};