System.EventArgs。using System;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
Car car = new Car();
car.OnOilWarning += OilWarning; // 訂閱事件
car.FillOil(5); // 加油 5 公升
car.Startup(); // 嘗試啟動
}
// 事件處理器
public void OilWarning(object sender, OilEventArgs e)
{
MessageBox.Show($"監測到汽車油量異常,當前油量:{e.OilMass} 公升");
}
}
// 1. 定義委派型別
public delegate void OilEventHandler(object sender, OilEventArgs e);
// 2. 定義事件參數
public class OilEventArgs : EventArgs
{
public int OilMass { get; }
public OilEventArgs(int oilMass) { OilMass = oilMass; }
}
// 3. 發布者:汽車類別
public class Car
{
private int _oilMass = 0;
// 定義事件
public event OilEventHandler OnOilWarning;
public void FillOil(int oilMass) => _oilMass = oilMass;
public void Startup()
{
if (_oilMass < 10)
{
// 觸發事件:傳送 this 與事件參數
OnOilWarning?.Invoke(this, new OilEventArgs(_oilMass));
}
}
}
Car 實例。Form1 將 OilWarning 方法註冊至 car.OnOilWarning。FillOil(5) 設定油量。Startup(),判斷油量 < 10 → 觸發事件。OilWarning,彈出訊息框顯示油量。event 關鍵字限制外部只能 +=/-=,不能直接 = 或 Invoke,保護封裝性。?.Invoke (C# 6) 為空條件運算子,避免無訂閱者時拋出 NullReferenceException。EventHandler 結尾,參數為 (object sender, TEventArgs e)。EventHandler<TEventArgs> 泛型委派,免自訂委派型別。WeakEventManager)。async void 處理器或 Task 回傳型別。事件是 C# 實現觀察者模式的原生支援。掌握「定義委派 → 定義參數 → 宣告事件 → 觸發事件 → 訂閱處理」五步驟,即可輕鬆構建鬆耦合的元件通訊架構。