在C#中编写匿名函数的推荐方法是什么?

时间:2009-06-24 18:53:58

标签: c# syntax lambda anonymous-methods

var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });

我认为sort2更明确但排序1更短。除此之外,我真的不知道其中的区别。建议的方法是什么?

7 个答案:

答案 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:

  • 如果你没有使用C#3,显然它们不可用。(虽然你可以从VS2008定位.NET 2.0并仍然使用它们。)
  • 无参数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);
};
相关问题