共用方式為


事件和委派

更新: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。委派可以讓事件處理更彈性和精細的控制。委派可藉由維持事件之已註冊事件處理常式的清單,扮演引發事件之類別的事件分派者。

如需有關在元件或控制項中使用委派來提供事件功能的詳細資訊,請參閱引發事件

如需在應用程式中使用事件的概觀,請參閱使用事件

請參閱

工作

HOW TO:引發和使用事件

HOW TO:將事件處理常式方法連接到事件

概念

使用事件

引發事件

其他資源

處理和引發事件