事件和委派

事件是由物件傳送用來表示發生某種動作的訊息。 這個動作可能是由使用者互動 (例如按一下滑鼠) 所造成,也可能是由其他程式邏輯所觸發 (Trigger)。 引發事件的物件稱為事件傳送者。 捕捉事件並且回應它的物件稱為事件接收者。

在事件通訊中,事件傳送者類別並不知道哪個物件或方法將會接收 (處理) 它所引發的事件, 所需要的是在來源與接收者之間有個媒介物 (或類似指標的機制)。 .NET Framework 定義一種可提供函式指標功能的特殊型別 (Delegate)。

委派是存有某一方法之參考的類別。 與其他類別的不同之處在於,委派類別具有簽章 (Signature),而且它只能存有符合其簽章之方法的參考。 所以委派相當於型別安全函式指標或者回呼 (Callback)。 雖然委派還有其他用途,不過在這裡的討論將專注於委派的事件處理功能。 委派宣告已足以定義委派類別。 宣告提供委派的簽章,而 Common Language Runtime 則提供實作。 以下範例所示為事件委派的宣告。

Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);

這個語法很類似方法的宣告,但是 delegate 關鍵字會告訴編譯器 AlarmEventHandler 是個委派型別。 依照慣例,.NET Framework 中的事件委派有兩個參數,引發事件的來源和事件的資料。

AlarmEventHandler 委派的執行個體 (Instance) 可以繫結至符合其簽章的任何方法,例如以下範例中 WakeMeUp 類別的 AlarmRang 方法。

Public Class WakeMeUp
    ' AlarmRang has the same signature as AlarmEventHandler.
    Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
        '...
    End Sub
    '...
End Class
public class WakeMeUp
{
    // AlarmRang has the same signature as AlarmEventHandler.
    public void AlarmRang(object sender, AlarmEventArgs e)
    {
        //...
    }
    //...
}
public ref class WakeMeUp
{
public:
    // AlarmRang has the same signature as AlarmEventHandler.
    void AlarmRang(Object^ sender, AlarmEventArgs^ e)
    {
        //...
    }
    //...
};

只有在事件產生事件資料時才會需要自訂事件委派。 許多事件 (包括像按一下滑鼠這類使用者介面事件) 不會產生事件資料。 在這種情況下,類別庫 (Class Library) 中對無資料事件提供的事件委派 System.EventHandler 即已足夠。 它的宣告如下。

Delegate Sub EventHandler(sender As Object, e As EventArgs)
delegate void EventHandler(object sender, EventArgs e);
delegate void EventtHandler(Object^ sender, EventArgs^ e);

事件委派為多點傳送,這表示它們可以存有對一個以上事件處理方法的參考。 如需詳細資訊,請參閱 Delegate。 委派可以讓事件處理更彈性和精細的控制。 委派可藉由維持事件之已註冊事件處理常式的清單,扮演引發事件之類別的事件分派者。

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

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

請參閱

工作

HOW TO:引發和使用事件

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

概念

使用事件

引發事件

其他資源

處理和引發事件