事件封裝「發生的事情」(用戶操作、系統通知),基於發布-訂閱模式實現組件解耦通信。
// 1. 定義委托類型
public delegate void BoilerLogHandler(string status);
// 2. 基於委托聲明事件
public event BoilerLogHandler BoilerEventLog;
// 3. 觸發事件(保護性調用)
protected void OnBoilerEventLog(string msg) {
BoilerEventLog?.Invoke(msg);
}
public class EventTest {
public delegate void NumHandler();
public event NumHandler ChangeNum;
protected virtual void OnNumChanged() => ChangeNum?.Invoke();
public void SetValue(int n) { if (value != n) { value = n; OnNumChanged(); } }
}
// 訂閱
EventTest e = new EventTest(5);
e.ChangeNum += () => Console.WriteLine("Event Fired!");
e.SetValue(7); // 觸發
發布器 DelegateBoilerEvent 檢測溫度/壓力,異常時觸發事件。訂閱器 BoilerInfoLogger 將日志寫入文件與控制台:
boilerEvent.BoilerEventLog += Logger; // 控制台 boilerEvent.BoilerEventLog += filelog.Logger; // 文件 boilerEvent.LogProcess(); // 觸發檢測並通知
輸出:Logging Info: Temperature 100 Pressure: 12 Message: O. K
?.Invoke() 空條件調用避免無訂閱者時拋異常EventHandler、EventArgs 衍生類