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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python实现基本数据结构【04/4】

说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…

2023高教社杯数学建模A题思路分析 - 定日镜场的优化设计

# 1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统, 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

FastViT实战:使用FastViT实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam安装mmcv 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集补充一个知识点:torch.jit两种保存方式 摘要 论文翻译:https://wanghao.blog.csdn.net/article/details/132407722?spm1001.2014.3001.550…

mysql leetcode打题记录

文章目录 完成度基本语法高级语法连接日期 函数编写函数聚合函数 因为上过的数据库课实在太水了,所以打算先在菜鸟教程/CSDN/leetcode先学一下基本语法,然后去做Stanford数据库原理的课程CS145。 小目标:把leetcode上不用钱的mysql的题先做一…

企业密码安全:ADSelfService Plus 提升密码管理的千里之行

在当今数字化时代,企业的密码安全变得至关重要。密码是保护企业敏感信息和数据的第一道防线,而有效的密码管理对于确保网络安全至关重要。ADSelfService Plus是一款强大的密码管理和自助服务解决方案,它在提供密码安全方面走在了前沿。 ADSel…

【大数据之Kafka】十、Kafka消费者工作流程

1 Kafka消费方式 (1)pull(拉)模式:消费者从broker中主动拉取数据。(Kafka中使用) 不足:如果Kafka中没有数据,消费者可能会陷入循环,一直返回空数据。 &#…

Python自动化测试(1)-自动化测试及基本技术手段概述

生产力概述 在如今以google为首的互联网时代,软件的开发和生产模式都已经发生了变化, 在《参与感》一书提到:某位从微软出来的工程师很困惑,微软在google还有facebook这些公司发展的时候,为何为感觉没法有效还击&…

嵌入式基础知识-信息安全与加密

本篇来介绍计算机领域的信息安全以及加密相关基础知识,这些在嵌入式软件开发中也同样会用到。 1 信息安全 1.1 信息安全的基本要素 保密性:确保信息不被泄露给未授权的实体。包括最小授权原则、防暴露、信息加密、物理加密。完整性:保证数…

电容笔值不值得买?开学季比较好用的电容笔

眼看着新学期即将到来,到底应该选择什么样的电容笔?一款原装的苹果Pencil,就卖到了将近一千块,这对于很多人来说,都是一个十分昂贵的价格。事实上,由于平替电容笔的价格非常便宜,只要一二百元就…

【Spring Boot 源码学习】OnClassCondition 详解

Spring Boot 源码学习系列 OnClassCondition 详解 引言往期内容主要内容1. getOutcomes 方法2. 多处理器拆分处理3. StandardOutcomesResolver 内部类4. getMatchOutcome 方法 总结 引言 上篇博文带大家从源码深入了自动配置过滤匹配父类 FilteringSpringBootCondition&#x…

尚硅谷大数据项目《在线教育之离线数仓》笔记007

视频地址:尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第12章 报表数据导出 P112 01、创建数据表 02、修改datax的jar包 03、ads_traffic_stats_by_source.json文件 P113 P114 P115 P116 P117 P118 P119 P120 P121 P122【122_在…

小米13Pro/13Ultra刷面具ROOT后激活LSPosed框架微X模块详细教程

喜欢买小米手机,很多是因为小米手机的开放,支持root权限,而ROOT对普通用户来说更多的是刷入DIY模块功能,今天ROM乐园小编就教大家如何使用面具ROOT,实现大家日常情况下非常依赖的微X模块功能,体验微X模块的…

Redis原理:动态字符串SDS

(课程总结自b站黑马程序员课程) 一、引言 Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题&…

DHTMLX Gantt 8.0.5 Crack -甘特图

8.0.5 2023 年 9 月 1 日。错误修复版本 修复 修复通过gantt.getGanttInstance配置启用扩展而触发的错误警告修复启用skip_off_time配置时gantt.exportToExcel()的不正确工作示例查看器的改进 8.0.4 2023 年 7 月 31 日。错误修复版本 修复 修复数据处理器不跟踪资源数据…

微信小程序slot插槽的介绍,以及如何通过uniapp使用动态插槽

微信小程序文档 - slots介绍 由上述文档看俩来&#xff0c;微信小程序官方并没有提及动态插槽内容。 uniapp文档 - slots介绍 uni官方也未提及关于动态插槽的内容 在实际使用中&#xff0c;直接通过 <<slot :name"item.xxx" /> 这种形式会报错&#xff…

23062C++QTday4

仿照string类&#xff0c;完成myString 类 代码&#xff1a; #include <iostream> #include <cstring> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造my…

分布式AKF拆分原则

目录 1 前言2 什么是AKF3 如何基于 AKF X 轴扩展系统&#xff1f;4 如何基于 AKF Y 轴扩展系统&#xff1f;5 如何基于 AKF Z 轴扩展系统&#xff1f;6 小结 1 前言 当我们需要分布式系统提供更强的性能时&#xff0c;该怎样扩展系统呢&#xff1f;什么时候该加机器&#xff1…

项目打包docker镜像 | 上传nexus | jenkins一键构建

文章目录 前言准备实操1、打开docker的远程访问2、编写dockerfile文件3、指定nexus环境4、配置jenkins5、使用jenkins构建 总结 前言 Docker部署项目是指使用Docker容器化技术将应用程序及其依赖项打包成一个独立的、可移植的运行环境&#xff0c;并在各种操作系统和平台上进行…

Unreal Engine Loop 流程

引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中&#xff0c;做了一个图。记录一下&#xff01;&#xff01; ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录&#xff0c;以备后用…

使用LightPicture开源搭建私人图床:详细教程及远程访问配置方法

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…