是否有一种语法是匿名处理程序的更好选择

本文关键字:处理 程序 选择 更好 语法 一种 是否 | 更新日期: 2023-09-27 18:18:57

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

// 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是数字2的简化版本。

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

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

是否有一种语法是匿名处理程序的更好选择

在这两种语法之间,是否有理由使用其中一种而不是另一种,或者它们基本上是做同一件事的两种方式?

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

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

请注意,匿名方法语法(使用delegate)确实具有lambda语法中没有的另一个特性。如果不打算使用这些参数,可以不使用它们,并写入:

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

也就是说,Lambda表达式(语法四)支持匿名方法的额外特性,包括更好的隐式类型,使用相同的语法创建表达式树,以及c# 5的异步Lambda支持。