var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });
我认为sort2更明确但排序1更短。除此之外,我真的不知道其中的区别。建议的方法是什么?
答案 0 :(得分:12)
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
答案 1 :(得分:2)
我更喜欢lambda语法(sort1)。我只使用需要它们的更详细的语法。我认为额外的非生产性代码只会妨碍我理解我正在编写的内容。
编辑:除非我正在使用.NET 2.0应用程序,否则您无法使用lambda语法。然后,我很高兴我至少有匿名方法。
答案 2 :(得分:2)
我发现这取决于场景,因为重要的方面是确保代码的意图对未来的维护者有充分的记录。因此,有时lambda效果最好,但有时候匿名方法是更好的选择。 lambda需要多于参数的问题是语法开始变得混乱,因此使用匿名方法委托语法来提供更易识别的结构有时会很有用。
在你给出的例子中,lambda是更好的选择,因为它清晰简洁;但是,当声明说内联事件处理程序时,匿名方法可能会提供更好的解决方案(关于可维护性)。
答案 3 :(得分:1)
我很喜欢lambda表达式的委托语法,但很少(我只能想到一个顶部)...
public event Action Evt = delegate {};
public event Action Evt = () => { };
......例如。其余的时间,代表只是阻碍了。 Per Jon的评论......
public event EventHandler Evt = delegate {};
public event EventHandler Evt = (s,ea) => { };
答案 4 :(得分:0)
据我所知,这两种方法都会生成完全相同的IL代码(至少在本例中),所以这真的是品味问题。我经常认为lambda的味道更好。
答案 5 :(得分:0)
sort1 - Lambdas我认为是编写匿名方法的首选方法
答案 6 :(得分:0)
我更喜欢lambda表达式,因为它们提供了最简洁的语法,并且类似于这个结构最初来自的函数式编程语言中的lambdas。当表达式包含多个语句或无功能构造时,我将使用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);
};