4

以下是我所知道的处理事件的所有方法。任何其他语法都只是在玩范围。

// one
Button.Click += delegate { /* do something */ };

// two
Button.Click += delegate(object s, EventArgs e) { /* do something */ };

// three
RoutedEventHandler handler = (s, e) => { /* do something */ };
Button.Click += handler;
Button.Click -= handler;

// four
Button.Click += (s, e) => { /* do something */ };

我理解数字one/two基本上是相同的,除了可以在结果逻辑中使用的显式参数。我也明白这个数字three允许我添加删除处理程序,这非常重要。而且,我知道数字four是数字二的简化版本。

我的问题更实际。在这两种语法之间,是否有任何理由使用一种而不是另一种,或者它们基本上是两种方法来做同样的事情?还有,你怎么知道?

// two
Button.Click += delegate(object s, EventArgs e) { /* do something */ };

// four
Button.Click += (s, e) => { /* do something */ };
4

1 回答 1

4

在这两种语法之间,是否有任何理由使用一种而不是另一种,或者它们基本上是两种方法来做同样的事情?

他们有效地做同样的事情。在这两种情况下,编译器都会为您匿名生成一个方法,创建委托并分配它。较新的 lambda 语法的主要优点是它更短。Anonymous Method 文档建议改用 lambda 语法(语法四):

C# 2.0 引入了匿名方法,在 C# 3.0 及更高版本中,lambda 表达式取代了匿名方法,成为编写内联代码的首选方式。

请注意,匿名方法语法 (using delegate) 确实具有 lambda 语法中没有的其他功能。如果你不打算使用这些参数,你可以把它们关掉,然后写:

Button.Click += delegate { /* do something */ };

话虽如此,Lambda 表达式(语法四)支持匿名方法的额外功能,包括更好的隐式类型,使用相同的语法创建表达式树,以及对 C# 5 的异步 lambda 支持。

于 2013-06-17T17:54:50.257 回答