从发布者和订阅者来看事件

2023-12-24 01:48
文章标签 事件 订阅 来看 发布者

本文主要是介绍从发布者和订阅者来看事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写一个事件代码,只需要记住5个部分即可,如图所示:


1.声明委托:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。

2.声明事件:发布者类必须声明一个订阅者类可以注册的事件成员。

3.触发事件:发布者类中触发事件,便会调用注册在事件上的所有事件处理程序。

4.注册事件:订阅者必须订阅事件才能在事件被触发时得到通知。

5.处理事件:订阅者会在事件发生后执行相应的处理程序。


一、猫和老鼠的例子(不传递数据)

代码如下:

using System;
namespace 练习专用
{//声明委托public delegate void MyDel();//发布者类-猫class Cat{//声明事件public event MyDel CatCryEvent;//在猫叫的方法中触发事件public void Cry(){Console.WriteLine("有只猫在叫。。。");//触发事件CatCryEvent();}}//订阅者类-老鼠class Mouse{public Mouse(Cat cat){//注册事件,订阅者老鼠向事件添加事件处理程序cat.CatCryEvent += Run;}//处理事件,事件发生后的处理程序void Run(){Console.WriteLine("老鼠快跑吧!!!");}}class Program{static void Main(string[] args){Cat cat1 = new Cat();Mouse mouse1 = new Mouse(cat1);cat1.Cry();}}
}


二、猫和老鼠的例子(传递数据)

可以使用System命名空间提供的EventHandler委托类型,所以不需要自己定义委托类型了,它是这么定义的:

public delegate void EventHandler(object sender, EventArgs e);
//第一个参数用来保存触发事件的对象的引用。由于是object类,所以可以匹配任何类型的实例
//第二个参数用来保存状态信息,指明什么类型适用于该应用程序
为了向事件处理程序的第二个参数传入数据,需要声明一个派生自EventArgs的自定义类来保存需要传入的数据。

代码如下:

using System;
namespace 练习专用
{//自定义一个派生自EventArgs的类,保存数据class CryEventArgs : EventArgs{//存储一个字符串public string CatName{get;set;}}//发布者类-猫class Cat{public string CatName{get;set;}//构造函数,给猫弄个名字public Cat(string name){this.CatName = name;}//声明事件,使用自定义类的泛型委托public static event EventHandler<CryEventArgs> CatCryEvent;//在猫叫的方法中触发事件public void Cry(){Console.WriteLine("有只猫在叫。。。");//把猫的名字保存到刚才的自定义类中CryEventArgs e = new CryEventArgs();e.CatName = this.CatName;//触发事件,传递参数CatCryEvent(this, e);}}//订阅者类-老鼠class Mouse{public Mouse(){//注册事件,订阅者老鼠向事件添加事件处理程序Cat.CatCryEvent += Run;}//处理事件,事件发生后的处理程序void Run(object sender, CryEventArgs e){if (e.CatName == "黑猫警长"){Console.WriteLine("是黑猫警长,老鼠快特么的跑吧!!!");}else{Console.WriteLine("不是黑猫警长,是{0},老鼠不用跑了。。。", e.CatName);}}}class Program{static void Main(string[] args){Cat cat1 = new Cat("黑猫警长");Cat cat2 = new Cat("小猫咪");Mouse mouse = new Mouse();cat1.Cry();Console.WriteLine("===============手动分割线===============");cat2.Cry();}}
}






这篇关于从发布者和订阅者来看事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/530188

相关文章

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

【Qt】定时器事件

定时器事件 在之前学习QTimer中实现了定时器的功能,而在QTimer背后是QTimerEvent定时器事件进行支撑的。在QObject中提供了一个timeEvent这个函数。 startTimer启动定时器killTimer关闭定时器 Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀

C++编程:ZeroMQ进程间(订阅-发布)通信配置优化

文章目录 0. 概述1. 发布者同步发送(pub)与订阅者异步接收(sub)示例代码可能的副作用: 2. 适度增加缓存和队列示例代码副作用: 3. 动态的IPC通道管理示例代码副作用: 4. 接收消息的超时设置示例代码副作用: 5. 增加I/O线程数量示例代码副作用: 6. 异步消息发送(使用`dontwait`标志)示例代码副作用: 7. 其他可以考虑的优化项7.1 立即发送(ZMQ_IM

Imageview在百度地图中实现点击事件

1.首先第一步,需要声明的全局有关类的引用 private BMapManager mBMapMan; private MapView mMapView; private MapController mMapController; private RadioGroup radiogroup; private RadioButton normalview; private RadioBu