C#事件学习笔记

news/2025/3/20 5:58:31/

一.事件概述:

事件的作用是降低模块间的耦合度,本质是观察者模式的应用,通过增加监听器,使事件响应函数的调用分散在各个对象自身内部,当增加和减少一个事件响应函数时,只需要增加或删除相应对象内的代码,降低了模块间的耦合度。

二.事件的应用

事件在游戏中广泛应用,游戏中经常触发的事件有:单点触摸事件,多点触摸事件,键盘事件,鼠标事件,各种自定义事件等。在MVC模式中,对代码要求质量较高的项目会规定在model中收到消息后不允许直接调用view类的方法,必须通过发送事件来间接调用。从广义上说,事件是初级程序必须要掌握的技能。

三.事件的要素

事件名称,发布者,订阅者,订阅者注册回调,发布者派发事件,订阅者回调执行

事件的实现基于委托的多播,事件是在委托类型变量前加上event关键字,其本质是用来对委托类型的变量进行封装。
事件相当于增强了委托的封装性,以保证委托类型的变量在类外部不能被直接调用。这样相当于无论是在类的内部声明public还是protected的委托类型变量,只要用事件event进行封装,其效果都相当于声明了一个私有的委托类型变量

namespace Console0719
{//发布者public class Publisher{// 和事件搭配的委托public delegate void PubDelegate();// 定义事件 public event PubDelegate PubEvent;// 编写处理事件的具体逻辑public void PublishEvent(){if (PubEvent == null){Console.WriteLine("无订阅者");}else{// 执行注册的事件 PubEvent(); }}}// 订阅者public class Subscriber{public string name { get; set; } public Subscriber(string s){name = s;}public void onEvent(){Console.WriteLine("{0} onWork", name);}}class Program{static void Main(string[] args){Publisher p = new Publisher();Subscriber s1 = new Subscriber("s1");Subscriber s2 = new Subscriber("s2");// 执行事件 p.PublishEvent();// 注册事件 p.PubEvent += new Publisher.PubDelegate(s1.onEvent);p.PubEvent += new Publisher.PubDelegate(s2.onEvent);// 执行事件 p.PublishEvent(); }}
}

 

四.事件与委托的区别

1.事件的实现基于委托的多播
2.在注册和注销事件上,委托可以使用=和+=来将函数注册到委托的变量上,使用-=来将函数注销。而事件则有着更严格的限制,事件只能使用+=来将函数注册到其上,使用-=来将函数注销。

3.事件类型的委托变量(即用事件封装的委托类型变量),在外部不能直接当成其引用的函数来进行调用(声明时加了event后直接调用会报错),它在外部只能用于注册或注销函数,而公有的委托类型在外部是可以直接用来调用对应的注册函数。


 


http://www.ppmy.cn/news/980974.html

相关文章

科大讯飞-旋转机械故障诊断挑战赛2023-测试【1】

引言 旋转机械故障诊断挑战赛是一项旨在提高旋转机械故障检测和识别能力的竞赛活动。旋转机械是工业生产中广泛应用的设备,其运行状态直接影响着生产效率和安全性。然而,由于各种原因,旋转机械可能会出现不同类型的故障,如轴承损坏…

spring数据校验

数据校验 概述 在开发中,会存在参数校验的情况,如:注册时,校验用户名不能为空、用户名长度不超过20个字符,手机号格式合法等。如果使用普通方式,会将校验代码和处理逻辑耦合在一起,在需要新增一…

2023杭电多校第三场 1012.Noblesse Code

传送门:Vjudge 前题提要:一道挺有意思的数论题.赛时对于这道题没什么想法,但是赛后细品之后其实感觉也就那么一回事.但是这种 更相损减术与辗转相除法 相转化的题目还是有点典的,需要好好消化一下. 首先看完题目.我们需要考虑的是 ( A , B ) (A,B) (A,B)与 ( a , b ) (a,b) (…

线程的控制

一、线程中断常用方法 setName //设置线程名称,使之与参数name相同getName //返回该线程的名称start //使该线程开始执行;java虚拟机底层调用该线程的start()方法run //调用线程对象的run方法setPriority //更改线程的优先级getPriority //获取线程的优…

Beamer学习手册

Beamer学习手册 ZJU Beamer模板解读参考链接 谨以本文记录一下学习beamer的过程 本文基于 Overleaf 的 ZJU Beamer模板 进行学习并修改模板,感谢前辈的贡献! ZJU Beamer模板解读 首先在 Overleaf 下载 ZJU Beamer模板 ,解压压缩包后&#xf…

IO进程线程day2(2023.7.26)

一、Xmind整理: 二、课上练习: 练习1:全缓冲 //由于编译器优化,只打开不操作,此时不会真正申请缓冲区。 fputc(a, fp); printf("%ld\n", fp->_IO_buf_end - fp->_IO_buf_base ); 刷新条件&#xff…

VRRP技术和浮动路由(第二十六课)

VRRP技术和浮动路由(第二十六课) 一、浮动路由 1、浮动路由概述 1)浮动路由是什么 -浮动路由又称为路由备份,由两条或多条链路组成浮动路由 -浮动路由指配置两条静态路由,这两条静态路由的目的地址相同,但是下一跳地址不同两…

学习笔记--TCP/IP协议

TCP/IP协议 TCP (Transmission Control Protocol)传输控制协议,传输层协议。 一、协议的分层 ISO网络层分为7层 二、分层的作用 具体通信情况: 三、报文传输 三次握手连接,四次挥手释放 参考链接: https://zhuanlan.zhih…