事件和委派
更新:2007 年 11 月
事件是由物件傳送用來表示發生某種動作的訊息。這個動作可能是由使用者互動 (例如按一下滑鼠) 所造成,也可能是由其他程式邏輯所觸發 (Trigger)。引發事件的物件稱為事件傳送者。捕捉事件並且回應它的物件稱為事件接收者。
在事件通訊中,事件傳送者類別並不知道哪個物件或方法將會接收 (處理) 它所引發的事件,所需要的是在來源與接收者之間有個媒介物 (或類似指標的機制)。.NET Framework 定義一種可提供函式指標功能的特殊型別 (Delegate)。
委派是存有某一方法之參考的類別。與其他類別的不同之處在於,委派類別具有簽章 (Signature),而且它只能存有符合其簽章之方法的參考。所以委派相當於型別安全函式指標或者回呼 (Callback)。雖然委派還有其他用途,不過在這裡的討論將專注於委派的事件處理功能。委派宣告已足以定義委派類別。宣告提供委派的簽章,而 Common Language Runtime 則提供實作。以下範例所示為事件委派的宣告。
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
這個語法很類似方法的宣告,但是 delegate 關鍵字會告訴編譯器 AlarmEventHandler 是個委派型別。依照慣例,.NET Framework 中的事件委派有兩個參數,引發事件的來源和事件的資料。
AlarmEventHandler 委派的執行個體 (Instance) 可以繫結至符合其簽章的任何方法,例如以下範例中 WakeMeUp 類別的 AlarmRang 方法。
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{...};
...
}
Public Class WakeMeUp
' AlarmRang has the same signature as AlarmEventHandler.
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
...
End Sub
...
End Class
只有在事件產生事件資料時才會需要自訂事件委派。許多事件 (包括像按一下滑鼠這類使用者介面事件) 不會產生事件資料。在這種情況下,類別庫 (Class Library) 中對無資料事件提供的事件委派 System.EventHandler 即已足夠。它的宣告如下。
delegate void EventHandler(object sender, EventArgs e);
Public Delegate Sub EventHandler(sender As Object, e As EventArgs)
事件委派為多點傳送,這表示它們可以存有對一個以上事件處理方法的參考。如需詳細資訊,請參閱 Delegate。委派可以讓事件處理更彈性和精細的控制。委派可藉由維持事件之已註冊事件處理常式的清單,扮演引發事件之類別的事件分派者。
如需有關在元件或控制項中使用委派來提供事件功能的詳細資訊,請參閱引發事件。
如需在應用程式中使用事件的概觀,請參閱使用事件。