C# 添加到按钮时,为什么要创建新的RoutedEventHandler';点击事件?

C# 添加到按钮时,为什么要创建新的RoutedEventHandler';点击事件?,c#,visual-studio,intellisense,C#,Visual Studio,Intellisense,以下两者之间的区别是什么: this.btnConnect.Click += btnConnect_Click; 以及: 这两种方式似乎都是一样的,但是VisualStudioIntelliSense插入了第二个示例,我很好奇为什么 我最初的猜测是,使用IntelliSense版本可以使每个按钮调用自己的RoutedEventHandler实例,从而使其线程安全? 使用第一个示例,然后每个按钮都会调用该方法的同一个实例,它们可能会互相踩着对方的脚。这是一样的,第一个只是一个语法糖,即编译器为这

以下两者之间的区别是什么:

this.btnConnect.Click += btnConnect_Click;
以及:

这两种方式似乎都是一样的,但是VisualStudioIntelliSense插入了第二个示例,我很好奇为什么

我最初的猜测是,使用IntelliSense版本可以使每个按钮调用自己的
RoutedEventHandler
实例,从而使其线程安全?
使用第一个示例,然后每个按钮都会调用该方法的同一个实例,它们可能会互相踩着对方的脚。

这是一样的,第一个只是一个语法糖,即编译器为这两者生成相同的IL字节码-始终会创建一个委托实例


IIRC,C的第一个版本不允许第一种语法,它是在C#2.0中引入的。

您也可以使用Lambda来新建RoutedEventHandler:

        new RoutedEventHandler(
            (sendItem, args) =>
            {
                //things you want to do
                IsTopMost = !IsTopMost;
                this.Topmost = IsTopMost;
                ((MenuItem) sendItem).Header = menuWords[0, ++menuClickCount[0]%2];
            })

回答得好。我要补充的是,第二种语法可以称为“显式”,而第一种语法具有从指定事件推断的委托类型;ReSharper将第二个表单标记为“多余”。提示不错,尽管这并没有解决这个问题。您还可以将lambda表达式直接分配给按钮单击事件,而无需将其包装在
RoutedEventHandler
中,即
this.btnConnect.click+=(发送方,参数)=>{/*执行操作*/}
        new RoutedEventHandler(
            (sendItem, args) =>
            {
                //things you want to do
                IsTopMost = !IsTopMost;
                this.Topmost = IsTopMost;
                ((MenuItem) sendItem).Header = menuWords[0, ++menuClickCount[0]%2];
            })