在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# 事件编程的标准做法。