2009-09-28 156 views
26

我已經這樣做了一段時間,但我沒有注意到,我每次刪除事件處理程序時都使用了new。我應該創造一個新的對象?C#刪除事件處理程序

基本上1和2之間有區別嗎?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

編輯: 好吧,這是一個重複。對於那個很抱歉。 答覆已發過標籤here

具有相同目標,方法和調用列表的相同類型的兩個代表被認爲是相等的。

回答

29

1和2之間沒有區別,因爲2是1的語法糖。只有2引用類級別委託實例字段而不是實際方法名稱纔會有區別在編譯的IL中。

就運行時發生的情況而言,事件Remove方法似乎並不關心傳遞給它的委託實例是否與傳遞給Add方法的實例相同。我不記得這是爲什麼,但我猜想委託實例總是被實施。

編輯:喬恩斯基特說,事件Remove方法使用的值相等(Delegate.Equals),以確定到從列表中刪除,其代表,而不是實習+參考平等。同樣的結果,不同的方法。 :-)

+0

由於委託只是對方法和(可選)實例的引用,所以比較這兩個方法應該足以確定相等性。 – Botz3000 2009-09-28 09:55:38

+0

是的,但一般來說,如果您在任意引用類型上調用'new T()'兩次,您會得到兩個不同的實例。由於這對於委託人來說似乎不是這樣,我推斷委託構造函數會像'Type'類一樣自動實例化實例。 – 2009-09-28 10:00:23

+0

實習 - 這是什麼意思?感謝你的回答。這種解決我的疑問。當我添加處理程序並在刪除處理程序時創建一個新處理程序時,我對這個新程序感到疑惑,因爲我正在創建一個新的程序。很奇怪。 – Sharun 2009-09-28 10:10:31

13

第二個版本相當於第一個;它只是使用較短的語法。這是在C#2.0中實現的