C# 事件的选择与使用
在C#中选择使用EventHandler还是自定义事件委托,取决于具体需求。以下是详细对比
一、决策指南
在 C# 中,EventHandler 是一个泛型委托,用于简化事件的定义和处理。它允许你创建带有自定义事件参数的事件,而不需要每次都定义新的委托类型。以下是一个完整的应用示例:
二、示例场景:温度监控系统
当温度超过阈值时触发警报事件,传递当前温度值。
using System;
using System.Threading;// 1. 定义自定义事件参数类(必须继承 EventArgs)
public class TemperatureChangedEventArgs : EventArgs
{public double CurrentTemperature { get; }public TemperatureChangedEventArgs(double temperature){CurrentTemperature = temperature;}
}// 2. 事件发布者(温度传感器)
public class TemperatureSensor
{// 3. 使用 EventHandler<T> 声明事件public event EventHandler<TemperatureChangedEventArgs>? TemperatureExceeded;private readonly double _threshold;private double _currentTemp;public TemperatureSensor(double threshold){_threshold = threshold;_currentTemp = 20.0; // 初始温度}public void StartMonitoring(){var random = new Random();while (true){// 模拟温度变化_currentTemp += random.NextDouble() * 2 - 1; // -1°C 到 +1°C 变化Console.WriteLine($"当前温度: {_currentTemp:F1}°C");// 检测是否超过阈值if (_currentTemp > _threshold){OnTemperatureExceeded(_currentTemp);}Thread.Sleep(1000); // 每秒检测一次}}// 4. 触发事件的受保护方法(标准模式)protected virtual void OnTemperatureExceeded(double temperature){TemperatureExceeded?.Invoke(this, new TemperatureChangedEventArgs(temperature));}
}// 5. 事件订阅者(警报系统)
public class AlarmSystem
{public AlarmSystem(TemperatureSensor sensor){// 6. 订阅事件(+= 操作符)sensor.TemperatureExceeded += HandleTemperatureAlert!;}// 7. 事件处理方法(符合 EventHandler<T> 签名)private void HandleTemperatureAlert(object sender, TemperatureChangedEventArgs e){Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine($"\n[警报] 温度超标!当前温度: {e.CurrentTemperature:F1}°C\n");Console.ResetColor();}
}class Program
{static void Main(){// 创建温度传感器(阈值设为25°C)var sensor = new TemperatureSensor(25.0);// 创建警报系统并订阅事件var alarm = new AlarmSystem(sensor);// 开始监控(会触发事件)sensor.StartMonitoring();}
}
通过这种方式,EventHandler 提供了类型安全且高效的事件处理机制,是 C# 事件编程的标准做法。