C#事件event
事件模型的5个组成部分
事件拥有者(event source)(类对象)(有些书将其称为事件发布者)
事件成员(event)(事件拥有者的成员)(事件成员就是事件本身,事件不会主动发生,其只会在事件拥有者的内部逻辑的触发下发生。)
事件响应者(event subscriber)(类对象)(有些书将其称为事件订阅者)
事件处理器(event handler)(事件的响应者的成员)(根据拿到的事件参数/信息对事件进行处理)
事件订阅(委托类型)
举个栗子:妈妈喊儿子回家吃饭,儿子听到立马跑回家。
在上面这个例子中,事件拥有者是妈妈(Mother),事件成员是喊(Say),事件响应者是儿子(Son),事件处理是跑步回家(Gohome)。
接下来我们尝试去写这个过程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp5event
{//事件拥有者(event source)(类对象)(有些书将其称为事件发布者)//事件成员(event)(事件拥有者的成员)(事件成员就是事件本身,事件不会主动发生,其只会在事件拥有者的内部逻辑的触发下发生。)//事件响应者(event subscriber)(类对象)(有些书将其称为事件订阅者)//事件处理器(event handler)(事件的响应者的成员)(根据拿到的事件参数/信息对事件进行处理)//事件订阅(委托类型 delegate)//举个栗子1:“裁判员开枪,运动员开始跑步。”//1.1事件拥有者是裁判员,//1.2事件成员是开枪,//1.3事件响应者是运动员,//1.4事件处理是开始跑步。//举个栗子2:这是WinForm编程中常用的一种方式,比如在一个窗体中,存在一个文本框和按钮,现在要通过点击按钮让文本框上显示出文字“Hello World”。//2.1发生的事件是:鼠标点击;//2.2事件拥有者是:按钮(Button),鼠标点击的是它,它是窗体对象的一个字段成员;//2.3事件响应者是窗体对象;//2.4事件处理是:窗体对象让自己的字段成员文本框(TextBox)显示出文字“Hello World”。//从发生到响应的5个动作:①事件拥有者拥有一个事件→②事件响应者订阅了这个事件→③事件拥有者触发了事件→④事件响应者会被依次通知到(按照订阅的顺序)→⑤事件响应者根据拿到的事件参数对事件进行处理//下面的示例是:你妈妈喊“回家吃饭”,你(儿子)跑步回家。//事件拥有者是妈妈,//事件成员是喊话,//事件响应者是儿子,//事件处理是跑步回家。//在声明事件之前,需要先声明一个委托类型来作为约束,即事件订阅,其约束了事件(喊话)能够发送什么事件参数给事件响应者(儿子),以及当事件响应者(儿子)的事件处理器(跑步回家)符合规定时(即符合委托类型指定的签名和返回值类型),事件订阅要将其保存起来(即委托字段引用方法)。根据命名规范,该委托应该命名为“事件名+EventHandler”。//可以将事件标记为public、private、protected、internal、protected internal 或 private protected。 这些访问修饰符定义该类的用户访问该事件的方式。 internal class Program{static void Main(string[] args){Mother mother = new Mother();//事件的拥有者Son son = new Son();//事件的相应者mother.Say += son.Gohome; //事件Say,事件处理器gohome,事件订阅+= 也就是只要妈妈说话了,儿子就时时刻刻接收妈妈说的话mother.SayingProcess(); //触发事件,模拟妈妈喊儿子回家过程Console.ReadKey();}}//用于传递事件参数(事件信息)的类,该例子中主要用于将妈妈的话传递给儿子public class SayEventArgs : EventArgs{public String sentence { get; set; } //说了什么话}//声明委托类型(事件订阅)//第1个参数为事件拥有者(妈妈),第2个参数是用来存储喊儿子回家的相关信息(事件参数) public delegate void SayEventHandler(Mother mother, SayEventArgs e);//妈妈类:事件拥有者public class Mother{//根据前面声明的委托类型来创建一个委托类型字段,用来触发事件处理器(儿子回家)private SayEventHandler sayEventHandler;//声明事件://event为事件关键字,SayEventHandler表示用此委托来约束该事件public event SayEventHandler Say{//添加事件处理器add{sayEventHandler += value;}//删除事件处理器remove{sayEventHandler -= value;}}//下面的Say就相当于上面的Say(事件和儿子的动作进行绑定)和SayEventArgs(事件传输参数,用于将妈妈的话传给儿子)//public void Say(string sentence)//{// Console.WriteLine("妈妈说:"+sentence);//}//模拟妈妈喊儿子的过程:public void SayingProcess(){Console.WriteLine("输入回车后开始模拟:妈妈做好饭喊儿子回家");Console.ReadLine();Console.WriteLine("妈妈已经做好饭了");Thread.Sleep(1000);Console.WriteLine("妈妈走向窗户边");Thread.Sleep(1000);Console.WriteLine("妈妈准备喊话");Thread.Sleep(1000);//触发事件:if (sayEventHandler != null) //若不存在任何事件处理器则无法触发事件{//准备好事件参数(即准备好妈妈想说的话)SayEventArgs e = new SayEventArgs();e.sentence = "儿子回家吃饭了";Console.WriteLine("妈妈说:“"+e.sentence+"”");Thread.Sleep(1000);//调用事件处理器(就是)sayEventHandler(this, e);e.sentence = "儿子买点盐去,家里没有盐了";Console.WriteLine("妈妈说:“" + e.sentence + "”");Thread.Sleep(1000);sayEventHandler(this, e);}}}//儿子类:事件响应者public class Son{//想儿子要回家的话,首先得有妈妈约束(所以第一个参数是事件的拥有者),其次是妈妈做了什么(喊吃饭,所以第二个参数是事件)才能让儿子回家//此处的参数必须与SayEventHandler一样public void Gohome(Mother mother, SayEventArgs e){Thread.Sleep(1000);Console.WriteLine("儿子接收到妈妈的话:"+e.sentence);Thread.Sleep(1000);if (e.sentence.Contains("回家")){Console.WriteLine("儿子说:“好的,妈妈,我马上回家吃饭”");}else {Console.WriteLine("儿子说:“妈妈,自己去买呗,我还想在外面玩会”");} }}}
运行结果如下
参考文献
event - C# 参考 - C# | Microsoft Learn
C# 事件(event)_c# event_熊思宇的博客-CSDN博客
C#中的事件(event)_c# event_香芋派丶的博客-CSDN博客
相关文章:

C#事件event
事件模型的5个组成部分 事件拥有者(event source)(类对象)(有些书将其称为事件发布者) 事件成员(event)(事件拥有者的成员)(事件成员就是事件本身…...

气传导耳机什么牌子好?盘点五款好用的气传导耳机分享
对于气传导耳机,大家最关心的可能是佩戴会不会不舒服?音质好不好?会不会漏音?等问题。面对这些问题,今天我就为大家推荐几款市面上最好的气传导耳机,总有一款适合你的! ①NANK南卡00压气传导…...
业绩走低,毛利率下滑,海外市场能否成为极米科技救命稻草?
撰稿|行星 来源|贝多财经 8月30日,成都极米科技股份有限公司(SH:688696,下称“极米科技”)发布2023年半年度业绩报告。财报显示,极米科技2023年上半年的业绩出现了大幅下滑,其中收入同比减少两成…...

轻松敏捷开发流程之Scrum
Scrum是一种敏捷开发流程,它旨在使软件开发更加高效和灵活。Scrum将软件开发过程分为多个短期、可重复的阶段,称为“Sprint”。每个Sprint通常为两周,旨在完成一部分开发任务。 在Scrum中,有一个明确的角色分工: 产品…...

Vue3+Element Plus实现el-table跨行显示(非脚手架)
Vue3Element Plus实现el-table跨行显示 app组件内容使用:span-method"objectSpanMethod"自定义方法实现跨行显示查询方法初始化挂载新建一个html即可进行测试,完整代码如下效果图 app组件内容 <div id"app"><!-- 远程搜索 --><e…...

生成订单30分钟未支付,则自动取消,该怎么实现?
今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己试一把了哈! 在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户…...

WebGIS外包开发流程
WebGIS开发流程需要综合考虑前端和后端开发、地理信息数据处理、用户需求和安全性等多个方面。成功的WebGIS应用程序需要不断地进行更新和维护,以适应变化的需求和技术。WebGIS开发是一个复杂的过程,通常包括以下主要步骤。北京木奇移动技术有限公司&…...

pytorch学习——LSTM和GRU
参考书籍:https://zh-v2.d2l.ai/chapter_recurrent-modern/lstm.html 参考论文: https://colah.github.io/posts/2015-08-Understanding-LSTMs/ 简介: LSTM(长短期记忆网络)和GRU(门控循环单元)…...
【Python】Python 利用模块实现单例模式
Python 利用模块实现单例模式 在GOF的23种设计模式中,单例是最常使用的模式,通过单例模式可以保证系统中 一个类只有一个实例而且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资 源。每当大家想要实现一个名为XxxMangcr的类时&…...

雅思写作 三小时浓缩学习顾家北 笔记总结(四)
目录 The company should provide maternity leave and other assistance to female employees with children. Community redevelopment provides opportunities for offenders to acquire vocational skills. The law should classify drunk driving as a criminal offens…...

深入学习与探索:高级数据结构与复杂算法
文章目录 学习高级数据结构B树:数据库引擎的骨干线段树:高效的区间查询Trie树:高效的字符串检索 探索复杂算法领域图算法:解决复杂网络问题字符串匹配算法:处理文本搜索近似算法:在NP难题上取得近似解 结论…...
CV:计算机视觉CV运用领域
计算机视觉是一项涉及大量算法和技术的跨学科领域,已经在众多领域得到广泛的应用。以下是计算机视觉的一些主要应用领域: 图像处理和图像分析:计算机视觉技术可以用于图像处理和图像分析,识别和检测特定的图像特征,例如…...

开源机密计算平台:蓬莱-OpenHarmony
演讲嘉宾 | 杜 东 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 杜东,上海交通大学助理研究员。中国计算机学会CCF会员,ACM会员。研究兴趣为操作系统与体系结构、服务器无感知(Serverless)计算、系统安全。在包括ASPLOS、ISC…...
大一大二一心学算法的利弊
学习算法是现代计算机科学和软件工程领域中的重要组成部分。它们是解决复杂问题、优化资源利用以及提高效率的关键。学习算法的过程可以帮助培养系统性思维、分析问题能力和创造性解决方案的能力。然而,学习算法也有一些利弊,我们将在下文中详细探讨。 …...
c#using关键字的作用
https://blog.csdn.net/Mona_Zhao/article/details/91363446 using关键字的三种作用: 1. 引用命名空间; 2. 为命名空间或者类型创建别名; 3. 使用using语句。 (1)引用命名空间 类似于c和c的#include<>, pyt…...

只依赖OPENCV的工作服安全帽检测YOLOV8S
工地安全帽工作服检测Y8S,采用YOLOV8S训练模型,然后使用OPENCV的DNN调用,彻底拜托PYTORCH依赖,可以在C,PYTHON,ANDROID上跑。附件是C生成的效果测试(只需解压将图片或者视频放入VIDEOS文件夹,文件夹没图片或…...
MFC|选择获取文件路径
参考:mfc按钮选择文件或者文件夹(https://blog.csdn.net/qq_39433050/article/details/130261518) 点击按钮槽函数,选择文件 void CMFCStartGrabDlg::OnBnClickedSelectfile() {// TODO: Add your control notification handler…...

实时操作系统Freertos开坑学习笔记:(七):队列
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么?而在freertos中,队列是什么呢?①如果要进行中断、任务的交流,那我用全局变量行吗?②…...

专业游戏翻译公司怎么选择比较合适
近年来,游戏行业持续繁荣,市场需求也在不断扩大,其中游戏翻译的需求越来越旺盛。无论是引进游戏还是让游戏走向国际市场,都需要专业的翻译公司来帮忙。那么,怎么选择合适的游戏翻译公司呢?让我们一起来看看…...
阿里云Maven和Gradle仓库最新配置
文章目录 一、简介二、仓库地址三、如何配置1、Maven配置2、Gradle配置 一、简介 阿里云云效 Maven 是什么? 阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库,帮助研发人员提高研发生产效率,使用阿里云Maven中央仓库作为下载源&am…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...