在 C# 中,事件是類別或物件用來通知外部發生特定動作的機制。想像一個按鈕控制項:當使用者點擊時,按鈕本身不關心要執行什麼業務邏輯,它只負責「通知」有人點擊了它。這就是事件的核心精神——發布者不需要知道訂閱者的細節,只負責廣播消息。
public delegate void CustomEventHandler(object sender, EventArgs e);
慣例上第一個參數為事件來源,第二個參數攜帶事件相關資料。雖然 .NET 建議遵循此模式,但 C# 僅強制要求回傳型別為 void。
public class EventPublisher
{
// 使用 event 關鍵字修飾,限制外部只能 += / -=
public event CustomEventHandler OnCustomEvent;
protected virtual void RaiseEvent()
{
// 線程安全的觸發模式:先複製再檢查
var handler = OnCustomEvent;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
public class EventSubscriber
{
public void Subscribe(EventPublisher publisher)
{
publisher.OnCustomEvent += HandleEvent;
}
public void Unsubscribe(EventPublisher publisher)
{
publisher.OnCustomEvent -= HandleEvent;
}
private void HandleEvent(object sender, EventArgs e)
{
Console.WriteLine($"收到事件,來源:{sender}");
}
}
若需完全控制事件的註冊邏輯(如使用字典管理大量事件),可使用 add/remove 存取器:
private EventHandlerList _events = new EventHandlerList();
private static readonly object EventKey = new object();
public event EventHandler CustomEvent
{
add { _events.AddHandler(EventKey, value); }
remove { _events.RemoveHandler(EventKey, value); }
}
event 關鍵字,防止外部直接呼叫委派EventHandler<TEventArgs> 泛型委派減少樣板碼protected virtual void OnEventName() 方法讓衍生類別覆寫IDisposable 時務必取消訂閱,防止記憶體洩漏掌握事件機制,是寫出鬆耦合、可擴充 C# 應用程式的關鍵基石。