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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值