C# 事件實作了發佈-訂閱模式:
.NET 事件基於 EventHandler 委派與 EventArgs 基類建構。
Load、Click)// 自動產生的處理方法
private void Form1_Load(object sender, System.EventArgs e)
{
// 處理邏輯
}
// Designer.cs 中自動產生的訂閱程式碼
this.Load += new System.EventHandler(this.Form1_Load);
// 定義處理方法(符合 EventHandler 簽章)
void HandleCustomEvent(object sender, CustomEventArgs e)
{
// 處理邏輯
}
// 訂閱
publisher.RaiseCustomEvent += HandleCustomEvent;
// C# 1.0 風格(等效)
publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
public Form1()
{
InitializeComponent();
// 使用 Lambda 訂閱 Click 事件
this.Click += (s, e) =>
{
MessageBox.Show(((MouseEventArgs)e).Location.ToString());
};
}
publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
⚠ 注意:使用匿名方法或 Lambda 訂閱後,若需取消訂閱較為麻煩,必須保存委派參考。建議需動態取消訂閱時使用具名方法。
使用減法指派運算子 -=:
publisher.RaiseCustomEvent -= HandleCustomEvent;
為何要取消訂閱?
EventHandler<TEventArgs> 泛型委派var handler = MyEvent; handler?.Invoke(this, e);async void 僅限於事件處理方法,其他情況用 async Task