Windows 應用程式基於訊息迴圈:系統偵測硬體輸入 → 封裝為訊息 → 分派至視窗程序 → 觸發對應事件處理器。C# 事件模式封裝此機制,提供型別安全的發布/訂閱介面。
delegate void AlarmEventHandler(object sender, EventArgs e);event AlarmEventHandler Alarm; (編譯器產生 add/remove 存取器與私有委派欄位)OnAlarm(),檢查 if (Alarm != null) Alarm(this, e);dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);OnAlarm()// 事件引數自訂
public class ThiefEventArgs : EventArgs {
public int Count { get; }
public ThiefEventArgs(int count) => Count = count;
}
// 發送者
public class Dog {
public delegate void AlarmEventHandler(object sender, ThiefEventArgs e);
public event AlarmEventHandler Alarm;
public void OnAlarm(ThiefEventArgs e) {
Alarm?.Invoke(this, e); // C# 6+ null 條件運算子
}
}
// 接收者
public class Host {
public Host(Dog dog) => dog.Alarm += HandleAlarm;
void HandleAlarm(object sender, ThiefEventArgs e) {
if (e.Count <= 1) Console.WriteLine("主人: 抓住了小偷!");
else Console.WriteLine($"主人: 打110報警,我家來了 {e.Count} 個小偷!");
}
}
// 觸發測試
var dog = new Dog();
var host = new Host(dog);
dog.OnAlarm(new ThiefEventArgs(1)); // 抓住了小偷
dog.OnAlarm(new ThiefEventArgs(3)); // 打110報警
EventHandler 結尾,參數為 (object sender, TEventArgs e)EventArgs,不可變設計protected virtual 允許衍生類別覆寫EventHandler<TEventArgs> 泛型委派減少自訂委派宣告EventHandlerList 儲存節省記憶體WeakEventManager) 防止記憶體洩漏// event AlarmEventHandler Alarm;
// 實際編譯為:
private AlarmEventHandler _alarm;
public event AlarmEventHandler Alarm {
add { _alarm += value; }
remove { _alarm -= value; }
}
// 存取器預設為同步鎖定 (lock(this)),可自訂 add/remove 實作無鎖版本


