2011-07-08 54 views
3

對於樣品....如何刪除事件?

SampleClass:

public class SampleClass 
{ 
    public delegate void BeforeEditorHandle(); 
    public event BeforeEditorHandle OnBeforeEditor; 
} 

MainMethod

static void Main(string[] args) 
    { 
     SampleClass sc = new SampleClass(); 
     // Add Event 
     sc.OnBeforeEditor +=new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor); 
     // Remove Event 
     sc.OnBeforeEditor -= new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor); 

    } 

而且,如果我通過動態添加事件是這樣的...↓

sc.OnBeforeEditor +=() => { }; 

是否應該刪除↓

但我認爲這是非常醜陋的,當我有太多的來源,事件.... 有人可以告訴我最好的方式來刪除事件嗎?

回答

6

我敢肯定,在這裏你的代碼將無法正常工作:

而且如果我通過動態添加事件是這樣的...↓

sc.OnBeforeEditor +=() => { }; 

我應該刪除像↓

事件
sc.OnBeforeEditor -=() => { }; 

這是因爲重述拉姆達創建一個新的不同的拉姆達。

你需要存儲的舊參考,並用它來退訂:

BeforeEditorHandle myHandler=() => { } 
sc.OnBeforeEditor += myHandler; 

... 
sc.OnBeforeEditor -= myHandler; 

爲了方便退訂,你可以收集你的事件處理程序的集合(例如List<BeforeEditorHandle>)英寸

+0

謝謝....你是對的,這是在我的示例中是錯誤的.... :) – shenhengbin

+0

@Oded你改變了什麼?我認爲我們有編輯衝突。 – CodesInChaos

+0

剛剛在你的'...':)前加了4個空格 – Oded

8

您可以將事件處理函數/λ給一個變量,然後您可以訂閱和取消訂閱:

var myHandler =() => { }; 

sc.OnBeforeEditor += myHandler; 

sc.OnBeforeEditor -= myHandler; 
+0

謝謝,很容易知道... – shenhengbin

+0

您需要明確鍵入myHandler。('不能分配lambda表達式到一個隱式類型的本地變量') – CodesInChaos

2

MSDN

重要的是要注意到你 不能輕易從 事件退訂,如果你使用匿名 功能訂閱是非常重要的。在這種情況下 退訂,它是 要回去的地方, 您訂閱的情況下,存儲 匿名方法的委託 變量,然後委託添加到 事件的代碼。一般來說,我們建議您使用 ,您不使用匿名 函數訂閱事件,如果 您將不得不在 代碼的稍後時間取消訂閱 事件。有關 匿名函數的更多信息,請參見匿名函數 函數(C#編程指南)。