2011-10-13 53 views
4

以下两种订阅事件的方式有什么区别?C#为什么我要在订阅活动时使用“新”关键字?

receiver.ConfigChanged += Config_ConfigChanged; 

receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); 

看来,他们两人的工作方式相同,但如果是这样,那为什么要使用第二个点?

如何取消订阅,以下两种方法的工作方式也是一样吗?

receiver.ConfigChanged -= Config_ConfigChanged; 

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

[+ = new EventHandler(Method)vs + = Method](http://stackoverflow.com/questions/2749868/new-eventhandlermethod-vs-method) – James

+0

http://stackoverflow.com/questions/26877/c事件处理程序 – Connell

+0

它们是相同的。代码生成器更喜欢长格式,您可以使用短格式。注意' - = new'看起来有多混乱。 –

回答

12

的详细的工作方式在C#中,只在C#2和后来的一小段路所有版本。所以我认为现在没有理由使用漫长的道路。

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

取消订阅将以任何方式工作,因为它基于价值平等,而不是参照平等。如果我正确记得方法组的隐式转换和明确的new被转换为相同的IL代码。隐式转换只是语法糖。

+0

是的,我同意。令人讨厌的是,插入新事件处理程序的VS片段仍然使用旧的语法。 – Grokys

+0

+1 - 谢谢你。我显然还停留在黑暗的时代:) – ChrisBD

2

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

这里有一个关于事件订阅MSDN的文章 - 它说什么@CodeInChaos刚刚确认:http://msdn.microsoft.com/en-us/library/ms366768%28v=vs.80%29.aspx

0

纠正我,如果我错了,但我不知道这是否正常工作

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

由于这些是2个不同的实例 我认为这将

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

不过话说回来,为什么不使用

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

你是,嗯,单词(错误?)。第一个例子是事件系统特有的,并且可以按照需要工作。 – Grokys

+0

我从来没有看过这个,但我也一直认为这是事实。如果我需要删除事件,我总是将EventHandler的实例声明为该类中的变量,然后我可以从该事件中删除该实例。我实际上做了很多,看完这个问题之后,我开始问自己是否可以节省很多时间。 – Connell

+0

好的,谢谢你,我每天都在学:) :) – Frederiek

0

好了,所以

receiver.ConfigChanged -= Config_ConfigChanged; 

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

var eventHandler = new EventHandler(Config_ConfigChanged); 

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

receiver -= eventHandler; 

只会清除一个eventHandler。

如果您不关心跟踪处理程序,您可以使用详细的方式

+0

你确定这两个例子有区别吗? – CodesInChaos

+0

这是前一阵子,所以我不记得了,但我通常会测试这些东西,以免有人告诉我我错了:) –

相关问题