C# 带和不带“的接线事件之间的差异”;新";

C# 带和不带“的接线事件之间的差异”;新";,c#,events,syntax,delegates,C#,Events,Syntax,Delegates,在C#中,这两行代码之间有什么区别(如果有的话) tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick); 及 两者的工作原理似乎完全相同。当你键入后者时,C#只是假设你指的是前者吗?我这样做了 static void Hook1() { someEvent += new EventHandler( Program_someEvent ); } static void Hook2() { someEvent += Pr

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

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

两者的工作原理似乎完全相同。当你键入后者时,C#只是假设你指的是前者吗?

我这样做了

static void Hook1()
{
    someEvent += new EventHandler( Program_someEvent );
}

static void Hook2()
{
    someEvent += Program_someEvent;
}
然后在代码上运行ildasm。
生成的MSIL完全相同

因此,要回答您的问题,是的,它们是相同的东西。
编译器只是推断您想要
someEvent+=neweventhandler(Program\u someEvent)

--您可以看到它在MSIL中创建新的
EventHandler
对象,在这两种情况下我认为没有任何区别。当然,resharper说第一行有多余的代码。

我认为真正能说明问题的一种方法是查看为代码生成的MSIL。。往往是一个很好的酸性测试


我有一个有趣的担忧,那就是它可能会以某种方式扰乱GC。。奇怪的是,如果不需要用这种方式声明新的委托类型,那么会有所有的开销,你知道吗?

在C#2003年以前,新的XYZEventHandler
并不是需要的,而且在C#2005?

以前,长形式是唯一的方法。在这两种情况下,您都是在新建一个委托,以指向程序\u someEvent方法。

有点离题:


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

好吧,它们都可以正常工作。那么为什么VisualStudio在自动创建事件处理程序存根时选择前者而不是后者呢?该功能可以追溯到VisualStudio2005之前,它引入了较短的语法。
static void Hook1()
{
    someEvent += new EventHandler( Program_someEvent );
}

static void Hook2()
{
    someEvent += Program_someEvent;
}