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…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
