更新:2007 年 11 月
事件是類別在物件上發生值得注意的資訊時 (例如在圖形化使用者介面中按一下控制項),通知物件使用者的方法。這種通知便稱為引發事件。引發事件的物件稱為事件的來源或傳送者。
不像在 Java 中是由實作自訂接聽程式類別執行事件處理,C# 程式開發人員能夠使用委派 (Delegate) 來處理事件。委派是封裝方法的一種型別,一旦以方法初始化委派,則該委派的行為便會與該方法完全相同,而且還能透過 () 運算子叫用。它類似於 C++ 函式指標,但為型別安全。
委派可以當做其他任何方法一般使用,也有參數和傳回值,如下列範例所示:
public delegate int ReturnResult(int x, int y);
如需委派的詳細資訊,請參閱委派 (C# 程式設計手冊)。
事件與方法類似,同樣也有包括名稱和參數清單的簽章。這個簽章是由委派型別定義,例如:
public delegate void MyEventHandler(object sender, System.EventArgs e);
在 Windows 使用者介面程式設計中,經常會擁有第一個參數做為參考事件來源的物件,第二個參數則做為持有與事件相關資料的物件。不過,C# 語言並不會要求或強制使用這種設計,只要傳回的是虛值,事件簽章便與任何有效委派簽章一樣。
可以使用 event 關鍵字來宣告事件,如這個範例所示:
public event MyEventHandler TriggerIt;
若要觸發事件,在引發事件時請定義要叫用的方法,如這個範例所示:
public void Trigger()
{
TriggerIt();
}
若要引發事件,請呼叫委派,並傳遞與事件相關的參數。接著委派會呼叫已加入事件的所有處理常式。每個事件都可以指定多個處理常式來接收事件。在這個情況下,事件會自動呼叫每個接收者。不論接收者的數目有多少,引發事件只需要對事件呼叫一次。
如果您希望類別接收事件,請使用 += 運算子將委派加入至事件,以訂閱該事件,例如:
myEvent.TriggerIt += myEvent.MyMethod;
若要取消訂閱事件,請使用 -= 運算子從事件中移除委派,例如:
myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);
如需事件的詳細資訊,請參閱事件 (C# 程式設計手冊)。
注意事項: |
|---|
在 C# 2.0 中,委派可以封裝具名方法和匿名方法。如需匿名方法的詳細資訊,請參閱匿名方法 (C# 程式設計手冊)。 |
範例
說明
下列程式碼範例會使用與其關聯的三個方法來定義事件。當觸發事件時就會執行方法。然後事件中就會移除一個方法,並且再次觸發事件。
程式碼
// Declare the delegate handler for the event:
public delegate void MyEventHandler();
class TestEvent
{
// Declare the event implemented by MyEventHandler.
public event MyEventHandler TriggerIt;
// Declare a method that triggers the event:
public void Trigger()
{
TriggerIt();
}
// Declare the methods that will be associated with the TriggerIt event.
public void MyMethod1()
{
System.Console.WriteLine("Hello!");
}
public void MyMethod2()
{
System.Console.WriteLine("Hello again!");
}
public void MyMethod3()
{
System.Console.WriteLine("Good-bye!");
}
static void Main()
{
// Create an instance of the TestEvent class.
TestEvent myEvent = new TestEvent();
// Subscribe to the event by associating the handlers with the events:
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
// Trigger the event:
myEvent.Trigger();
// Unsuscribe from the the event by removing the handler from the event:
myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
System.Console.WriteLine("\"Hello again!\" unsubscribed from the event.");
// Trigger the new event:
myEvent.Trigger();
}
}
輸出
Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!
注意事項: