源代碼組件概覽
需要在事件中使用的代碼有5部分,如圖15-4所示,后文會依次進行介紹。這些組件如下
所示
- 委托類型聲明事件和事件處理程序必須有共同的簽名和返回類型,它們通過委托類型
進行描述。 - 事件處理程序聲明訂閱者類中會在事件觸發時執行的方法聲明。它們不一定是顯式命
名的方法,還可以是第14章描述的名方法或Lambda表達式。 - 事件聲明發布者類必須聲明一個訂閱者類可以注冊的事件成員。當類聲明的事件為
public時,稱為發布了事件。 - 事件注冊訂閱者必須注冊事件才能在事件被觸發時得到通知。這是將事件處理程序與
事件相連的代碼。 - 觸發事件的代碼發布者類中“觸發”事件并導致調用注冊的所有事件處理程序的代碼。
聲明事件
發布者類必須提供事件對象。創建事件比較簡單一一只需要委托類型和名稱。事件聲明的語
法如下面的代碼所示,代碼中聲明了一個叫作countADozen的事件。注意如下有關CountedADozen
事件的內容。
- 事件聲明在一個類中。
- 它需要委托類型的名稱,任何附加到事件(如注冊)的處理程序都必須與委托類型的簽
名和返回類型匹配。 - 它聲明為public,這樣其他類和結構可以在它上面注冊事件處理程序。
- 不能使用對象創建表達式(new表達式)來創建它的對象。
事件是成員
一個常見的誤解是把事件視為類型,然而它不是。和方法、屬性一樣,事件是類或結構的成
員,這一點引出了幾個重要的特性。
- 由于事件是成員:
- 我們不能在一段可執行代碼中聲明事件;
- 它必須聲明在類或結構中,和其他成員一樣。
- 事件成員被隱式自動初始化為null。
事件聲明需要委托類型的名稱,我們可以聲明一個委托類型或使用已有的委托類型。如果聲
明一個委托類型,它必須指定將被事件注冊的方法的簽名和返回類型。
BCL聲明了一個叫作EventHandler的委托,專門用于系統事件,本章后面會介紹。