C# 对于匿名处理程序,一种语法是更好的选择吗?
以下是我知道的所有处理事件的方法。任何其他语法都只是在玩弄作用域C# 对于匿名处理程序,一种语法是更好的选择吗?,c#,windows-8,windows-store-apps,winrt-xaml,anonymous-function,C#,Windows 8,Windows Store Apps,Winrt Xaml,Anonymous Function,以下是我知道的所有处理事件的方法。任何其他语法都只是在玩弄作用域 // one Button.Click += delegate { /* do something */ }; // two Button.Click += delegate(object s, EventArgs e) { /* do something */ }; // three RoutedEventHandler handler = (s, e) => { /* do something */ }; Butto
// 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
基本上是相同的,除了可以在结果逻辑中使用的显式参数。我还知道numberthree
允许我添加和删除处理程序,这一点非常重要。而且,我知道数字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表达式取代匿名方法,成为编写内联代码的首选方法
请注意,匿名方法语法(使用委托
)还有一个在lambda语法中找不到的特性。如果您不打算使用这些参数,可以不使用它们,然后写下:
Button.Click += delegate { /* do something */ };
话虽如此,(语法四)支持比匿名方法更多的功能,包括更好的隐式类型,使用相同的语法创建表达式树,以及对C#5的异步lambda支持。注意,您不能像这样分离事件处理程序。@user1908061您可以使用以下任一语法分离事件处理程序:,但您必须首先将其分配给一个代理。这不是两种语法的优点或缺点。