有和没有“新”的接线事件之间的区别

Posted

技术标签:

【中文标题】有和没有“新”的接线事件之间的区别【英文标题】:Difference between wiring events with and without "new" 【发布时间】:2010-09-06 19:31:21 【问题描述】:

在 C# 中,这两行代码有什么区别(如果有的话)?

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

两者的工作方式似乎完全相同。当您键入后者时,C# 是否只是假设您指的是前者?

【问题讨论】:

嗯,它们都工作正常。那么为什么 Visual Studio 在自动创建事件处理程序存根时会选择前者而不是后者呢? 该功能可以追溯到 Visual Studio 2005 之前,它引入了更短的语法。 【参考方案1】:

我做了这个

static void Hook1()

    someEvent += new EventHandler( Program_someEvent );


static void Hook2()

    someEvent += Program_someEvent;

然后在代码上运行 ildasm。 生成的 MSIL 完全一样。

所以要回答您的问题,是的,它们是相同的。 编译器只是推断你想要someEvent += new EventHandler( Program_someEvent ); -- 您可以在 MSIL 中看到它在两种情况下都创建了新的 EventHandler 对象

【讨论】:

【参考方案2】:

过去(.NET 1.x 天)长格式是唯一的方法。在这两种情况下,您都在新建一个委托以指向 Program_someEvent 方法。

【讨论】:

【参考方案3】:

我认为没有任何区别。当然 resharper 说第一行有多余的代码。

【讨论】:

【参考方案4】:

有点题外话:

您可以实例化一个委托 (new EventHandler(MethodName)) 并(如果适用)重用该实例。

【讨论】:

【参考方案5】:

在 C#2003 之前,new XYZEventHandler 不是必需的,并且您可以省略 C#2005 中的冗余代码吗?

【讨论】:

【参考方案6】:

我认为真正判断的一种方法是查看为代码生成的 MSIL。往往是一个很好的酸性测试。

我有一个有趣的担忧,它可能会以某种方式与 GC 混淆。如果不需要以这种方式声明新的委托类型,那么声明新的委托类型会产生所有开销,这似乎很奇怪,你知道吗?

【讨论】:

以上是关于有和没有“新”的接线事件之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

点击事件click和.on('click') 两者之间的区别

jQuery复选框的更改和单击事件之间的区别

哪个规范定义了就绪事件?

通过IL分析C#中的委托事件FuncActionPredicate之间的区别与联系

Azure Web PubSub 和事件网格/事件中心之间有啥区别?

事件和中断之间的区别