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

C#事件的用法

前言

在C#中,事件(Event)可以实现当类内部发生某些特定的事情时,它可以通知其他类或对象。事件是基于委托(Delegate)的,委托是一种类型安全的函数指针,它定义了方法的类型,使得可以将方法作为参数进行传递。

事件包含以下一些基本概念:
委托(Delegate):定义了一个方法的类型,使得可以将方法作为参数传递。
事件(Event):基于委托的,用于在类或对象之间提供通知的机制。
事件处理器(Event Handler):是一个符合特定签名的方法,用于响应事件。

1、如何定义事件

定义事件
首先,你需要定义一个委托,然后基于这个委托来声明一个事件。
下面这个委托MyEventHandler有两个参数,第一个参数是object类型,第二个参数是TempEventArgs类型,TempEventArgs这个类型是我自己定义的,继承于EventArgs。

 public delegate void MyEventHandler(object sender, TempEventArgs e);//声明一个委托
public class TempEventArgs : EventArgs{public double Temp { get; set; }public TempEventArgs(double temp){this.Temp = temp;}}

然后定义一个包含事件的类如下:

  //定义一个类,这个类包含一个事件,这个类也称为目标类class Thermostat{//声明事件public event MyEventHandler MyEventHandlerEvent = delegate { };//空委托,这样我们就不用在调用事件时先进行null值判断了。private double _CurrentTemperature;public double CurrentTemperature{get{return _CurrentTemperature;}set{if (value != CurrentTemperature){_CurrentTemperature = value;MyEventHandlerEvent?.Invoke(this, new TempEventArgs(CurrentTemperature));//触发事件}}}}

上面的Thermostat类中定义了一个MyEventHandlerEvent事件,事件由event修饰,基于MyEventHandler这个委托类型。并且通过属性CurrentTemperature的值的改变来触发事件,事件触发时其实就是调用委托,并且给委托传递了两个参数,第一个参数是Thermostat对象,第二个参数是将改变后的温度传入TempEventArgs类型的对象。

2、订阅和取消订阅事件

其他类或对象可以通过+=操作符来订阅事件,通过-=操作符来取消订阅事件,比如Cooler这个类就是一个需要订阅事件的其他类,这个类包含了一个事件处理器TemperatureChanged,当订阅事件以后,当事件触发以后,就会根据事件做出相应的处理。

 /// <summary>/// 这个类称为观察者类/// </summary>class Cooler{public Cooler(double temperature){this.Temperature = temperature;}public double Temperature { get; set; }//温度阈值//事件处理器public void TemperatureChanged(object sender, TempEventArgs tempEventArgs){double temperature = tempEventArgs.Temp;if (temperature > Temperature){Console.WriteLine("当前温度过高,冷却器开启");}else{Console.WriteLine("当前温度过低,冷却器关闭");}}}

下面的代码通过 +=为cooler对象订阅事件,订阅事件以后,通过 thermostat.CurrentTemperature = 60;这行代码可以触发事件。当使用-=取消订阅事件以后,通过thermostat.CurrentTemperature = 50;也不能触发事件了。

Thermostat thermostat = new Thermostat();Cooler cooler = new Cooler(50);thermostat.MyEventHandlerEvent += cooler.TemperatureChanged;//为目标增加观察者,也叫做为cooler对象订阅事件thermostat.CurrentTemperature = 60;thermostat.MyEventHandlerEvent -= cooler.TemperatureChanged;//为目标减去观察者,也叫做为cooler对象取消订阅事件thermostat.CurrentTemperature = 50;

相关文章:

C#事件的用法

前言 在C#中&#xff0c;事件&#xff08;Event&#xff09;可以实现当类内部发生某些特定的事情时&#xff0c;它可以通知其他类或对象。事件是基于委托&#xff08;Delegate&#xff09;的&#xff0c;委托是一种类型安全的函数指针&#xff0c;它定义了方法的类型&#xff…...

金砖软件测试赛项之Jmeter如何录制脚本!

一、简介 Apache JMeter 是一款开源的性能测试工具&#xff0c;用于测试各种服务的负载能力&#xff0c;包括Web应用、数据库、FTP服务器等。它可以模拟多种用户行为&#xff0c;生成负载以评估系统的性能和稳定性。 JMeter 的主要特点&#xff1a; 图形用户界面&#xff1a;…...

docker-squash镜像压缩

docker-squash 和 docker export docker load 的原理和效果有一些相似之处&#xff0c;但它们的工作方式和适用场景有所不同。 docker-squash docker-squash 是一个工具&#xff0c;它通过分析 Docker 镜像的层&#xff08;layers&#xff09;并将其压缩成更少的层来减小镜像…...

Vue3快速入门+axios的异步请求(基础使用)

学习Vue之前先要学习htmlcssjs的基础使用 Vue其实是js的框架 常用到的Vue指令包括vue-on,vue-for,vue-blind,vue-if&vue-show,v-modul vue的基础模板&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8&…...

VM16安装macOS11

注意&#xff1a; 本文内容于 2024-09-17 12:08:24 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;VM16安装macOS11。感谢您的关注与支持&#xff01; 使用 Vmware Workstation Pro 16 安装 macOS…...

自定义复杂AntV/G6案例

一、效果图 二、源码 /** * * Author: me * CreatDate: 2024-08-22 * * Description: 复杂G6案例 * */ <template><div class"moreG6-wapper"><div id"graphContainer" ref"graphRef" class"graph-content"></d…...

Golang | Leetcode Golang题解之第419题棋盘上的战舰

题目&#xff1a; 题解&#xff1a; func countBattleships(board [][]byte) (ans int) {for i, row : range board {for j, ch : range row {if ch X && !(i > 0 && board[i-1][j] X || j > 0 && board[i][j-1] X) {ans}}}return }...

CCF刷题计划——LDAP(交集、并集 how to go)

LDAP 计算机软件能力认证考试系统 不知道为什么&#xff0c;直接给我报一个运行错误&#xff0c;得了0分。但是我在Dev里&#xff0c;VS里面都跑的好好的&#xff0c;奇奇怪怪。如果有大佬路过&#xff0c;请帮小弟看看QWQ。本题学到的&#xff1a;交集set_intersection、并集…...

谷歌论文提前揭示o1模型原理:AI大模型竞争或转向硬件

Open AI最强模型o1的护城河已经没有了&#xff1f;仅在OpenAI发布最新推理模型o1几日之后&#xff0c;海外社交平台 Reddit 上有网友发帖称谷歌Deepmind在 8 月发表的一篇论文内容与o1模型原理几乎一致&#xff0c;OpenAI的护城河不复存在。 谷歌DeepMind团队于今年8月6日发布…...

【ShuQiHere】 探索数据挖掘的世界:从概念到应用

&#x1f310; 【ShuQiHere】 数据挖掘&#xff08;Data Mining, DM&#xff09; 是一种从大型数据集中提取有用信息的技术&#xff0c;无论是在商业分析、金融预测&#xff0c;还是医学研究中&#xff0c;数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…...

LabVIEW提高开发效率技巧----使用事件结构优化用户界面响应

事件结构&#xff08;Event Structure&#xff09; 是 LabVIEW 中用于处理用户界面事件的强大工具。通过事件驱动的编程方式&#xff0c;程序可以在用户操作时动态执行特定代码&#xff0c;而不是通过轮询&#xff08;Polling&#xff09;的方式不断检查界面控件状态。这种方式…...

【前端】ES6:Set与Map

文章目录 1 Set结构1.1 初识Set1.2 实例的属性和方法1.3 遍历1.4 复杂数据结构去重 2 Map结构2.1 初识Map2.2 实例的属性和方法2.3 遍历 1 Set结构 它类似于数组&#xff0c;但成员的值都是唯一的&#xff0c;没有重复的值。 1.1 初识Set let s1 new Set([1, 2, 3, 2, 3]) …...

Java 之网络编程小案例

1. 多发多收 描述&#xff1a; 编写一个简单的聊天程序&#xff0c;客户端可以向服务器发送多条消息&#xff0c;服务器可以接收所有消息并回复。 代码示例&#xff1a; 服务器端 (Server.java): import java.io.*; import java.net.*; import java.util.concurrent.Execut…...

Spring Boot:现代化Java应用开发的艺术

目录 什么是Spring Boot&#xff1f; 为什么选择Spring Boot&#xff1f; Spring Boot的核心概念 详细步骤&#xff1a;创建一个Spring Boot应用 步骤1&#xff1a;使用Spring Initializr创建项目 步骤2&#xff1a;解压并导入项目 步骤3&#xff1a;构建和配置项目 po…...

Redis五种基本数据结构的使用

Redis具有五种基本数据类型&#xff1a;String(字符串)、Hash(哈希)、List(列表)、Set(集合)、SortedSet(有序集合)&#xff0c;下面示意它们的使用。 String类数据类型的使用 增&#xff1a;添加数据(set)、添加多个数据(mset)、添加数据时指定过期时间(setex) ​ 删&#xf…...

【QT】系统-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;QTheadrun() &#x1f449;&#x1f3fb;QMutex&#x1f449;&#x1f3fb;QWaitCondition&#x1f449;&#x1f3fb;Q…...

java和kotlin 可以同时运行吗

Java 和 Kotlin 可以同时运行在同一个项目中&#xff0c;这主要得益于 Kotlin 对 Java 的互操作性。Kotlin 被设计为与 Java 100% 兼容&#xff0c;这意味着 Kotlin 代码可以很容易地调用 Java 代码&#xff0c;反之亦然。这种设计使得 Kotlin 能够无缝集成到现有的 Java 项目中…...

2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程

​ 在数字化时代&#xff0c;数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作&#xff0c;然而&#xff0c;由于MacOS系统默认不支持NTFS的写操作&#xff0c;这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…...

npm发布插件超级简单版

在开源的世界里&#xff0c;每个人都有机会成为贡献者&#xff0c;甚至是创新的引领者。您是否有过这样的想法&#xff1a;开发一个解决特定问题的小工具&#xff0c;让他成为其他开发者手中的利器&#xff1f;今天&#xff0c;我们就来一场实战训练&#xff0c;学习如何将你的…...

C# 访问Access存取图片

图片存入ole字段&#xff0c;看有的代码是获取图片的字节数组转换为base64字符串&#xff0c;存入数据库&#xff1b;显示图片是把base64字符串转换为字节数组再显示&#xff1b;直接存字节数组可能还好一点&#xff1b; 插入的时候用带参数的sql写法比较好&#xff1b;用拼接…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...