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

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

http://www.xdnf.cn/news/706501.html

相关文章:

  • 命令模式,观察者模式,状态模式,享元模式
  • 同为.net/C#的跨平台运行时的mono和.net Core有什么区别?
  • Android开发常用Kotlin高级语法
  • 已解决:.NetCore控制台程序(WebAPI)假死,程序挂起接口不通
  • Java求职面试:从Spring到微服务的技术挑战
  • 【.net core】Rotativa 如何在linux上实现
  • 分布式数据库备份实践
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)
  • CSS篇-1
  • dis css port brief 命令详细解释
  • Windows MongoDB C++驱动安装
  • idea本地git上传gitee码云失败分析,push rejected+git手动融合
  • 工程化架构设计:Monorepo 实战与现代化前端工程体系构建
  • 从零开始创建 Vue 3 开发环境并构建第一个 Demo
  • 前端-关于apk文件分片上传
  • 代码随想录算法训练营 Day59 图论Ⅸ dijkstra优化版 bellman_ford
  • 基于URL弹窗的图片链接生成功能技术实现
  • 快速了解 GO 之依赖注入与 mock测试
  • [Go] Option选项设计模式 — — 编程方式基础入门
  • 驱动开发(2)|鲁班猫rk3568简单GPIO波形操控
  • 2025年数字经济与绿色金融国际会议:智能金融与可持续发展的创新之路
  • Vue Hook Store 设计模式最佳实践指南
  • 计算机操作系统(十四)互斥锁,信号量机制与整型信号量
  • C语言文件读取中文乱码问题解析与解决方案
  • Spring boot集成milvus(spring ai)
  • 员工管理系统 (Python实现)
  • 智能手机上用Termux安装php+Nginx
  • 金融欺诈有哪些检测手段
  • 关于AWESOME-DIGITAL-HUMAN的部署
  • 【HW系列】—C2远控服务器(webshell链接工具, metasploit、cobaltstrike)的漏洞特征流量特征