以下是我知道处理事件的所有方法。任何其他语法只是在玩范围。
// 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 */ };
答案 0 :(得分:4)
在这两种语法之间,是否有任何理由使用其中一种或者它们基本上是两种方法来做同样的事情?
他们有效地做同样的事情。在这两种情况下,编译器都会匿名为您生成方法,创建委托并分配它。较新的lambda语法的主要优点是它更短。 Anonymous Method documentation建议改为使用lambda语法(语法四):
C#2.0引入了匿名方法,在C#3.0及更高版本中,lambda表达式取代了匿名方法,作为编写内联代码的首选方法。
请注意,匿名方法语法(使用delegate
)确实具有lambda语法中未找到的另一个功能。如果您不打算使用这些参数,可以将它们关闭,并写下:
Button.Click += delegate { /* do something */ };
话虽这么说,Lambda Expressions(语法四)支持匿名方法的额外功能,包括更好的隐含式输入,使用相同的语法创建表达式树,以及异步lambda支持C#5。