C#为什么我在订阅活动时会使用“new”关键字?

订阅以下两种订阅方式有什么区别?

receiver.ConfigChanged += Config_ConfigChanged; receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); 

似乎它们都以相同的方式工作,但如果是这样,那么使用第二种方法有什么意义呢?

如果取消订阅,以下两种方法的工作方式是否相同?

 receiver.ConfigChanged -= Config_ConfigChanged; receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged); 

详细的方式适用于所有版本的C#,这只是C#2及更高版本的简短方法。 所以我认为现在没有理由使用漫长的道路。

在某些情况下,您仍然需要使用new DelegateType(methodGroup) ,但事件订阅不是其中之一。 这些情况通常涉及generics类型推断或方法重载。

取消订阅将以任何方式工作,因为它基于值相等而不是引用相等。 如果我没记错,从方法组隐式转换和显式new get转换为相同的IL代码。 隐式转换只是语法糖。

无论您使用的是哪种版本的框架,Visual Studio的TAB事件自动完成始终默认为.Net 1.0的处理方式。 你可能会发现一些习惯于阅读旧方式的人。 我只是通过使用Resharper遇到了不那么冗长的方式!

这是关于事件订阅的MSDN文章 – 它确切地说明了@CodeInChaos刚刚确认的内容: http : //msdn.microsoft.com/en-us/library/ms366768%28v=vs.80%29.aspx

如果我错了,请纠正我,但我不知道这是否有效

 receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged); 

由于这些是两个不同的实例,我认为这样做

 var configChanged = new EventHandler(Config_ConfigChanged); receiver.ConfigChanged += configChanged; receiver.ConfigChanged -= configChanged; 

但话说回来,为什么不用它

 receiver.ConfigChanged += Config_ConfigChanged; receiver.ConfigChanged -= Config_ConfigChanged; 

好的

 receiver.ConfigChanged -= Config_ConfigChanged; 

将清除所有引用该方法的事件处理程序。

 var eventHandler = new EventHandler(Config_ConfigChanged); receiver.ConfigChanged += eventHandler; receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); receiver -= eventHandler; 

只会清除一个eventHandler。

如果您不关心跟踪处理程序,则使用详细的方法。