OnXxx)+=)半夜小偷來,狗吠觸發 `Alarm` 事件,主人接收並處理。
// 事件發送者
public class Dog {
// 1. 委派
public delegate void AlarmEventHandler(object sender, EventArgs e);
// 2. 事件
public event AlarmEventHandler Alarm;
// 3. 激發方法
public void OnAlarm() {
if (Alarm != null) {
Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~");
Alarm(this, EventArgs.Empty);
}
}
}
// 事件接收者
public class Host {
// 4. 處理器
void HostHandleAlarm(object sender, EventArgs e) {
Console.WriteLine("主人: 抓住了小偷!");
}
// 5. 註冊
public Host(Dog dog) => dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}
// 6. 測試
class Program {
static void Main() {
var dog = new Dog();
var host = new Host(dog);
DateTime now = new DateTime(2008, 12, 31, 23, 59, 50);
DateTime midnight = new DateTime(2009, 1, 1, 0, 0, 0);
Console.WriteLine("時間一秒一秒地流逝...");
while (now < midnight) {
Console.Write($"當前時間: {now:HH:mm:ss}\r");
Thread.Sleep(1000);
now = now.AddSeconds(1);
}
dog.OnAlarm(); // 午夜觸發
Console.ReadKey();
}
}
// 自訂事件參數
public class ThiefCountEventArgs : EventArgs {
public int Count { get; }
public ThiefCountEventArgs(int count) => Count = count;
}
public class Dog {
public delegate void AlarmEventHandler(object sender, ThiefCountEventArgs e);
public event AlarmEventHandler Alarm;
public void OnAlarm(ThiefCountEventArgs e) {
if (Alarm != null) {
Console.WriteLine($"\n狗報警: 有 {e.Count} 個小偷進來了!");
Alarm(this, e);
}
}
}
public class Host {
void HostHandleAlarm(object sender, ThiefCountEventArgs e) {
if (e.Count <= 1)
Console.WriteLine("主人: 抓住了小偷!");
else
Console.WriteLine($"主人: 打 110 報警,我家來了 {e.Count} 個小偷!");
}
public Host(Dog dog) => dog.Alarm += HostHandleAlarm; // 方法群組轉換簡化
}
// 測試
dog.OnAlarm(new ThiefCountEventArgs(3)); // 輸出: 打 110...
EventHandler 結尾On + 事件名 (如 OnAlarm)object sender (發送者)、EventArgs e (參數)EventArgs 衍生類,多數場景可直接用
自訂事件是 C# 解耦的核心利器。掌握「委派→事件→激發→處理→註冊」標準流程,並善用自訂 EventArgs 攜帶業務資料,即能建構出彈性、可擴充的事件驅動架構。