2010-03-02 16 views

回答

12

就像+ =訂閱你的事件處理程序一樣, - =取消訂閱它。

使用它時,你不再需要時,引發該事件被稱爲一個特定的處理程序。你經常只需要使用它引發事件的組件在邏輯上要長於事件的處理程序 - 如果不取消,將「事件專業戶」,有效地具有對處理程序的引用,因此可以把它比活得更長你要。

正如評論指出:

  • -=只會刪除單個處理器;如果有多個處理程序訂閱(即使使用完全相同的委託),它仍然只會將處理程序計數減1。指定處理程序的最後一個實例是已刪除的處理程序。 (所以,如果你以前有處理程序A,B,A,C認購的順序,並刪除A,你最終與A,B,C)
  • -=不會導致錯誤,如果指定的處理尚未訂閱該代表;它只是忽略了這個請求。即使事件目前沒有處理程序訂閱,情況也是如此。
+6

+1。另外值得一提的是,如果未能退訂某個事件,往往是程序內存不足的原因,因爲它會阻止對象變爲符合GC的條件。 – RichardOD

+0

喬恩,我有點害怕的事實,我們都開始我們的答案與「就像...」;-) –

+0

什麼是VB.NET版本的' - ='..我的意思是如何取消訂閱事件..? – dotNETbeginner

6

就像您可以通過+=添加事件處理程序一樣,您可以通過-=刪除它們。

例如:

mybutton.Click += new EventHandler(myhandler); 

以後,您可以刪除它是這樣的:

mybutton.Click -= new EventHandler(myhandler); 

......因爲同樣的方法和實例事件處理程序是等價的(所以你不需要保留給您+=使用的處理程序的引用,並使用與-=那一個)。

3

+=-=運營商可以在C#被用於從一個對象的事件中的一個添加/移除事件處理程序/:

// adds myMethod as an event handler to the myButton.Click event 
myButton.Click += myMethod; 

上面的代碼運行後,myMethod方法將被調用每次點擊了myButton

// removes the handler 
myButton.Click -= myMethod; 

上面的代碼運行後,點擊myButton將不再導致myMethod被調用。

1

我懷疑的+ =背景邏輯用於將所述處理程序添加到事件處理程序的列表/陣列,用於給定的事件。當使用 - =時,它會將右手參數與它爲此事件保存的事件處理程序列表進行比較,並將其從列表中刪除。如果你爲給定的事件做了多個+ =,每個處理程序都會被調用。

換句話說: + =表示添加一個方法來的方法的列表在事件發生時調用。 - =表示從要調用的方法列表中刪除指定的方法。

如果全部刪除,事件將沒有處理程序,並且該事件將被忽略。