HOW TO:訂閱及取消訂閱事件 (C# 程式設計手冊)
您訂閱了某個由其他類別發行的事件,而您想要撰寫在該事件引發時呼叫的自訂程式碼。例如,您可能訂閱了某個按鈕的 "click" 事件,好讓您的應用程式在使用者按一下該按鈕時,能夠執行某些有用的事。
若要使用 Visual Studio 2005 IDE 訂閱事件
如果看不到 [屬性] 視窗,請在 [設計] 檢視中以滑鼠右鍵按一下要建立事件處理常式的表單或控制項,然後選取 [屬性]。
在 [屬性] 視窗的頂端,按一下 [事件] 圖示。
按兩下要建立的事件,例如
Load
事件。Visual C# 會建立空白的事件處理常式方法,並將其加入程式碼中。您也可以在 [程式碼] 檢視中手動加入程式碼。例如,下列程式碼行會宣告一個事件處理常式方法,該方法將會在
Form
類別引發Load
事件時呼叫。private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
訂閱此事件所需的程式碼行也會在專案內 Form1.Designer.cs 檔案中的
InitializeComponent
方法內自動產生。產生的程式碼行如底下所示:this.Load += new System.EventHandler(this.Form1_Load);
若要以程式設計方式訂閱事件
定義事件處理常式方法,其簽章 (Signature) 與事件的委派簽章相符。例如,如果該事件是根據 EventHandler 委派型別 (Delegate Type),則下列程式碼會代表方法 Stub:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
使用加法指派運算子 (+=),將事件處理常式附加到事件上。在下列範例中,假設某個名為
publisher
的物件具有名為RaiseCustomEvent
的事件。請注意,subscriber 類別必須參考 publisher 類別,才能訂閱 publisher 類別的事件。publisher.RaiseCustomEvent += HandleCustomEvent;
請注意,上述語法是 C# 2.0 內新增的語法,這個語法與 C# 1.0 語法完全相同,也就是必須使用 new 關鍵字來明確建立封裝委派:
publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
若要使用匿名方法來訂閱事件
使用加法指派運算子 (+=) 可將匿名方法 (Anonymous Method) 附加到事件上。在下列範例中,假設某個名為
publisher
的物件具有名為RaiseCustomEvent
的事件,而且也已經定義CustomEventArgs
類別來包含某種特別的事件資訊。請注意,subscriber 類別必須參考publisher
,才能訂閱 publisher 類別的事件。publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e) { string s = o.ToString() + " " + e.ToString(); Console.WriteLine(s); };
請注意,如果使用了匿名方法來訂閱事件,則無法簡單地取消訂閱該事件,這一點非常重要。若要在這種情況下取消訂閱,請回到訂閱該事件的程式碼,並將此匿名方法儲存到委派變數內,然後再將該委派加入此事件中。
取消訂閱
若要避免在引發事件時叫用 (Invoke) 事件處理常式,只需取消訂閱該事件即可。為了避免發生資源流失的情形,請務必在處置 (Dispose) 訂閱者物件之前先取消訂閱事件。取消訂閱事件之前,發行物件內事件底層的多點傳送委派會參考封裝訂閱者之事件處理常式的委派。只要發行物件擁有該參考,便無法對您的訂閱者物件進行記憶體回收。
若要取消訂閱事件
使用減法指派運算子 (-=) 取消訂閱事件:
publisher.RaiseCustomEvent -= HandleCustomEvent;
當所有訂閱者都取消訂閱事件時,發行者 (Publisher) 類別內的事件執行個體 (Instance) 會設定為 null。
請參閱
工作
HOW TO:發行符合 .NET Framework 方針的事件 (C# 程式設計手冊)
參考
event (C# 參考)
-= 運算子 (C# 參考)
+= 運算子 (C# 參考)