c#编程,使用 事件 编程入门

在 C# 中,事件(Event) 是委托(Delegate)的封装,用于实现观察者模式(Observer Pattern)。


事件编程三要素

  1. 定义委托(约定事件签名)
  2. 声明事件(基于委托)
  3. 触发事件(在满足条件时调用)

示例:温度监控报警系统

场景:当现在的温度超过 阈值时,就触发事件通知

using System;

// 1. 定义自定义事件参数(传递数据),
// 这个是 当事件发生时候,要传递的参数, 这个类要继承 EventArgs,这里封装了当前温度属性(只读属性)
public class TemperatureChangedEventArgs : EventArgs
{
    public double CurrentTemperature { get; }

    public TemperatureChangedEventArgs(double temperature)
    {
        CurrentTemperature = temperature;
    }
}

// 2. 定义事件发布者(Publisher)
public class TemperatureMonitor
{
    // 3. 声明基于委托的事件(使用 EventHandler<T> 泛型)
    public event EventHandler<TemperatureChangedEventArgs> OnTemperatureExceeded;

    private double _threshold; //温度阈值

    public TemperatureMonitor(double threshold)
    {
        _threshold = threshold;
    }

    public void UpdateTemperature(double newTemperature)
    {
        if (newTemperature > _threshold)
        {
            // 4. 触发事件(安全调用), 线程安全调用 实例化的委托
            OnTemperatureExceeded?.Invoke(this, new TemperatureChangedEventArgs(newTemperature));
        }
    }
}

// 5. 定义事件订阅者(Subscriber)
public class AlertSystem
{
    public AlertSystem(TemperatureMonitor monitor)
    {
        // 6. 订阅事件
        monitor.OnTemperatureExceeded += HandleOverheat;
    }

    // 7. 事件处理方法(符合委托签名)
    private void HandleOverheat(object sender, TemperatureChangedEventArgs e)
    {
        Console.WriteLine($"警报:温度超标!当前温度 {e.CurrentTemperature}°C");
    }
}

// 使用示例
class Program
{
    static void Main()
    {
        var monitor = new TemperatureMonitor(100); // 阈值设为100°C
        var alert = new AlertSystem(monitor);

        monitor.UpdateTemperature(99); // 不会触发
        monitor.UpdateTemperature(105); // 触发事件,输出警报
    }
}

关键点说明

  1. 事件参数(EventArgs)

    • 继承 EventArgs,用于传递事件相关数据(如温度值)。
  2. 事件声明

    • 使用 event 关键字,命名建议以 On 开头(如 OnTemperatureExceeded)。
  3. 事件触发

    • 通过 ?.Invoke() 安全调用(避免空引用异常)。
  4. 订阅与取消

    • 使用 += 订阅事件,-= 取消订阅。
  5. 线程安全

    • 可在多线程场景中使用 lock 保护事件触发过程。

输出结果

警报:温度超标!当前温度 105°C

典型应用场景

  • 用户界面(如按钮点击事件)
  • 异步操作完成通知
  • 传感器数据实时监控
  • 游戏中的状态变化(如角色血量归零)

通过事件机制,可以实现松耦合的代码结构,让发布者和订阅者独立演化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值