這次單獨講講事件委託
理解一:事件委託的概念
.NET架構的事件委託遵循特定的簽名和命名規範。這種約定依賴於可視化設計工具,為用戶端代碼提供了一致性的模型。為了理解這種約定,下面來看看.NET架構中一個常見的可訪問事件委託System.EventHandler:
public delegate void EventHandler(object sender,EventArgs e);
下面是一些特定的事件委託簽名約定:
◎ 事件委託的傳回型別是void
◎ 一個事件委託帶有兩個參數。第一個參數是object類型,表示事件的寄件者。第二個參數
描述事件的資料,是由System.EventArgs派生出的類的執行個體。
應該根據.NET架構的命名規範來給事件數目據類和事件委託命名。事件數目據類由事件名再添加
尾碼EventArgs構成,如MonthChangeEventArgs。
事件委託由事件名再添加EventHandler尾碼構成,如MonthChangeEventHandler。事件委託
用事件處理常式(Event Handler)命名是因為她們將綁定到處理事件的方法上。
理解二:Wiring事件
將事件處理常式和事件相關聯的過程(添加委託給invocation列表)叫做事件布線(event wiring).
而從事件中刪除事件處理常式的過程叫做事件撤線(event unwring)。
在C#中,對於一個事件的布線和撤線事件處理常式的文法如下:
button.Click += new EventHandler(this.Button_Clicked);
button.Click -= new EventHandler(this.Button_Clicked) ;
這裡,button是Button控制項的一個執行個體,並建立於具有Button_Clicked方法的類中,該方法處理按鈕的Click事件。
理解三:事件委託的實現
為了在類中實現事件,需要一個事件數目據的類、事件委託、在類中擁有invocation列表的委託成員,以及一個發布事件通知的方法。
具體實現過程如下:
1)如果類沒有任何關聯的事件數目據,對事件數目據使用EventArgs類。或者可以使用其他事先已經存在的事件數目據類。如果不存在一個合適的事件數目據類,則定義一個事件來包含事件數目據。這個類必須從System.EventArgs中派生。按照規則它的名字應該是事件名加上EventArgs得到。例如,AdCreatedEventArgs,MonthChangedEventArgs.
下面的代碼聲明了一個事件數目據類:
public class LowChargeEventArgs:EventArgs{...}
2) 如果事件沒有關聯資料,使用第一步的EventArgs,用System.EventHandler作為事件委託或者使用能匹配事件的預先存在的其他委託。如果不存在一個合適的事件委託,則定義一個事件委託,該委託的第二個參數具備來自第一步的事件數目據類的類型。根據規則,事件委託的名字是在事件後附加EventHandler.例如,AdCreateEventHandler,MonthChangedEventHandler。下面的代碼用來定義事件委託:
public delegate void LowChargeEventHandler(object sender,LowChargeEventArgs e);
3) 在類裡,用event關鍵字定義事件成員。將事件名傳遞給事件成員。成員的類型是第二步中事件委託的類型。
如下面的例子:
public event LowChargeEventHandler LowCharge;
事件成員包含訂閱事件的委託的列表。當調用這個成員時,它通過調用委託來分配事件。
4) 在類裡,定義一個受保護的虛擬方法,在檢查是否有事件監聽器存在之後呼叫事件委託。其參數就是第一步中定義的事件數目據×EventArgs。方法的名字是在事件名前加上首碼On。例如:
protected virtual void OnLowCharge(LowChargeEventArgs e){
if (LowCharge != null){
LowCharge(this,e);
}
}
On<EventName>方法的目的是用來通知事件訂閱者。