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];
})