2011-10-13 52 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

這是前一陣子,所以我不記得了,但我通常會測試這些東西,以免有人告訴我我錯了:) –

相關問題