当前位置: 首页 > article >正文

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

典型应用场景

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

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


http://www.kler.cn/a/568799.html

相关文章:

  • C++(Qt)软件调试---Windows 性能分析器WPA(28)
  • [KEIL]单片机技巧 01
  • 如何用生成式AI工具(如GitHub Copilot)提升编程效率:实战技巧与避坑指南
  • 场外个股期权有哪些交易策略?场外期权策略方向如何选择?
  • Java基础语法38(异常处理try-catch和throws)
  • 腾讯集团软件开发-后台开发方向内推
  • 常见报错及解决方案
  • 剖析Kafka持久化底层原理
  • Spring AI:开启Java开发的智能新时代
  • Rust配置开发环境+服务器实战
  • DeepSeek 202502 开源周合集
  • Linux系统管理与编程04:基础知识(下)
  • uniapp-原生android插件开发摘要
  • Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名
  • 算法随笔_62: 买卖股票的最佳时机
  • ViewPager2跟ViewPager的区别
  • 【愚公系列】《鸿蒙原生应用开发从零基础到多实战》006-TypeScript 中的元组
  • 从 Transformer 到 DeepSeek-R1:大型语言模型的变革之路与前沿突破
  • 深入浅出 Go 语言:协程(Goroutine)详解
  • arxiv论文信息爬取与论文pdf下载