事件模型:
- Event source(对象)
- Event(成员)
- Event subscriber(对象)
- Event handler(回调方法)
- Event subscribe(委托 or 方法(实质上是一种语法糖),Event handler 与 Event 的联系与规定,例如Event可以将什么样的消息参数发给Event handler)

Event自身对handler作出了函数签名要求
Event += handlerFunction;传统写法:
Event += new EventHandler(handlerFunction); 现在支持用lambda表达式代替这个handler
This is why 事件基于委托
handler的方法的参数:
Object sender, sometypeArgs e sender : 触发事件的对象e :Event传递的参数一般应用是,写一个继承
sometypeArgs 的类,然后在event调用时传入这个类实例,handler自己处理using System; // 温度变化事件参数类,继承自EventArgs public class TemperatureChangedEventArgs : EventArgs { public double OldTemperature { get; } public double NewTemperature { get; } public DateTime ChangeTime { get; } public TemperatureChangedEventArgs(double oldTemp, double newTemp) { OldTemperature = oldTemp; NewTemperature = newTemp; ChangeTime = DateTime.Now; } } // 温度监控器类(事件发布者) public class TemperatureMonitor { private double _currentTemperature; // 1. 声明事件(使用EventHandler委托) public event EventHandler<TemperatureChangedEventArgs> TemperatureChanged; public double CurrentTemperature { get { return _currentTemperature; } set { if (_currentTemperature != value) { double oldTemp = _currentTemperature; _currentTemperature = value; // 2. 当温度变化时,触发事件 OnTemperatureChanged(oldTemp, value); } } } // 3. 定义触发事件的方法(通常以On开头) protected virtual void OnTemperatureChanged(double oldTemp, double newTemp) { // 创建事件参数 TemperatureChangedEventArgs args = new TemperatureChangedEventArgs(oldTemp, newTemp); // 触发事件(使用空条件运算符避免空引用异常) TemperatureChanged?.Invoke(this, args); } } // 温度显示器类(事件订阅者) public class TemperatureDisplay { private string _name; public TemperatureDisplay(string name) { _name = name; } // 4. 事件处理方法(必须与事件委托签名匹配) public void HandleTemperatureChanged(object sender, TemperatureChangedEventArgs e) { Console.WriteLine($"[{_name}] 温度变化: {e.OldTemperature}°C → {e.NewTemperature}°C"); Console.WriteLine($"变化时间: {e.ChangeTime:HH:mm:ss}"); if (e.NewTemperature > 30) { Console.WriteLine("警告: 温度过高!"); } else if (e.NewTemperature < 10) { Console.WriteLine("警告: 温度过低!"); } Console.WriteLine(); // 空行 } } // 温度警报器类(另一个事件订阅者) public class TemperatureAlarm { public void HandleTemperatureChanged(object sender, TemperatureChangedEventArgs e) { if (Math.Abs(e.NewTemperature - e.OldTemperature) > 5) { Console.WriteLine($"!!! 警报: 温度骤变 {Math.Abs(e.NewTemperature - e.OldTemperature)}°C !!!"); Console.WriteLine(); // 空行 } } } class Program { static void Main() { Console.WriteLine("温度监控系统启动...\n"); // 创建事件发布者 TemperatureMonitor monitor = new TemperatureMonitor(); // 创建事件订阅者 TemperatureDisplay livingRoomDisplay = new TemperatureDisplay("客厅显示器"); TemperatureDisplay kitchenDisplay = new TemperatureDisplay("厨房显示器"); TemperatureAlarm alarm = new TemperatureAlarm(); // 5. 订阅事件(使用 += 运算符) monitor.TemperatureChanged += livingRoomDisplay.HandleTemperatureChanged; monitor.TemperatureChanged += kitchenDisplay.HandleTemperatureChanged; monitor.TemperatureChanged += alarm.HandleTemperatureChanged; // 模拟温度变化 monitor.CurrentTemperature = 20.0; monitor.CurrentTemperature = 25.5; monitor.CurrentTemperature = 32.0; // 触发高温警告 monitor.CurrentTemperature = 15.0; // 触发温度骤变警报 monitor.CurrentTemperature = 8.0; // 触发低温警告 // 6. 取消订阅事件(使用 -= 运算符) monitor.TemperatureChanged -= kitchenDisplay.HandleTemperatureChanged; Console.WriteLine("已取消厨房显示器的订阅\n"); // 继续模拟温度变化 monitor.CurrentTemperature = 12.0; Console.WriteLine("程序结束"); } }