Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于匿名处理程序,一种语法是更好的选择吗?_C#_Windows 8_Windows Store Apps_Winrt Xaml_Anonymous Function - Fatal编程技术网

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
基本上是相同的,除了可以在结果逻辑中使用的显式参数。我还知道number
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表达式取代匿名方法,成为编写内联代码的首选方法

请注意,匿名方法语法(使用
委托
)还有一个在lambda语法中找不到的特性。如果您不打算使用这些参数,可以不使用它们,然后写下:

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

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

注意,您不能像这样分离事件处理程序。@user1908061您可以使用以下任一语法分离事件处理程序:,但您必须首先将其分配给一个代理。这不是两种语法的优点或缺点。