【问题标题】: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 之前,它引入了更短的语法。

标签: c# events syntax delegates


【解决方案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 混淆。如果不需要以这种方式声明新的委托类型,那么声明新的委托类型会产生所有开销,这似乎很奇怪,你知道吗?

            【讨论】:

              猜你喜欢
              • 2013-10-31
              • 2023-01-26
              • 2013-02-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-02-21
              • 2011-11-18
              相关资源
              最近更新 更多