C# 事件机制

在所有关于C#事件机制的介绍中,我更倾向于发布者/订阅者(Publisher/Subscriber)这种描述。理解事件机制并不是一件容易的事情,它所涉及的思想值得我们好好去研究。

本文资源来自《C#与.NET技术平台实战演练》——中国青年出版社

谈到事件,我们涉及到两个角色:事件发布者(Publisher)和事件订阅者(Scriber),也可以说是事件发送者(Sender)和事件接收者(Receiver)的关系。举个例子来说,市面上目前有许多杂志,杂志的种类也很多。而我只对其中的某些感兴趣,那么我就可以向杂志发行商提出订阅。之后,每当杂志发行时,我就会收到我在杂志发行商那儿订阅的杂志。在这个关系中,杂志发行商就相当于事件发行者,而我就是事件订阅者。每当杂志发行时,就触发了一个发行事件。

用面向对象的语言解释,这两者的意义如下:

事件发行者(Publisher)

它是一个对象,且会维护自身的状态信息。每当状态信息发生变动时,便触发一个事件,并通知所有的事件订阅者。对于杂志发行商来说,每本杂志都有自己的信息在里面,当杂志发行时,我要通知订阅该杂志的人:杂志已经发行啦,请注意查收!

事件接收者(Receiver)

这个对象要注册它感兴趣的对象,也就是订阅它自己喜欢的杂志啦。另外,这个对象通常要提供一个事件处理方法,在事件发行者触发一个事件后,会自动执行这个方法。对于上面所举的例子来说,也就是我收到杂志后要做什么事情,比如,你可以满世界地大喊:我收到杂志啦!也可以将杂志收藏起来慢慢欣赏,具体怎么实现完全取决你自己的喜好。

以下是.NET事件处理机制的模型:

 下面给一个简单的例子,用以阐述事件的思想:

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace EventDemo
 6{
 7       public delegate void SalaryCompute();        //声明一个代理类
 8
 9       public class Employee
10       {
11              public event SalaryCompute OnSalaryCompute;         //定义事件,将其与代理绑定
12
13              public virtual void FireEvent()       //触发事件的方法
14              {
15                     if (OnSalaryCompute != null)
16                     {
17                            OnSalaryCompute();      //触发事件
18                     }

19              }

20       }

21
22       public class HumanResource
23       {
24              public void SalaryHandler()          //事件处理函数
25              {
26                     Console.WriteLine("Salary");     //只是打印一行字而已
27              }

28
29              public static void Main()
30              {
31                     Employee ep = new Employee();
32                     HumanResource hr = new HumanResource();
33                     ep.OnSalaryCompute+=new SalaryCompute(hr.SalaryHandler);       //注册
34                     ep.FireEvent();        //触发事件
35                     Console.Read();
36              }

37       }

38}

39
在这个例子中,Employee类相当于一个事件发布者(Publisher),它定义了事件的相关信息,包括定义了一个事件用于计算薪水(OnSalaryCompute),以及一个触发事件的函数(FireEvent()),为简单起见,本例没有加上事件参数。

与之相对应,HumanResource类则相当于一个事件订阅者(Subscriber),它定义了一个事件处理函数(SalaryHandler()),并用+=将其与事件联系起来,从而使事件触发的时候能够调用我这个方法(在本例中也就是打印一行字啦)。值得注意的一点是,事件处理函数的方法签名要与代理的方法签名相同,这是非常重要的一点。

下面将这个例子改造一下,事件参数信息,用以完善事件机制。

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Threading;
 5
 6namespace EventDemo
 7{
 8       public delegate void SalaryCompute(object sender,MyEventArgs e);        //声明一个代理类
 9
10       public class Employee
11       {
12              public event SalaryCompute OnSalaryCompute;         //定义事件,将其与代理绑定
13
14              public virtual void FireEvent(MyEventArgs e)       //触发事件的方法
15              {
16                     if (OnSalaryCompute != null)
17                     {
18                            OnSalaryCompute(this,e);      //触发事件
19                     }

20              }

21       }

22
23       public class MyEventArgs : EventArgs         //定义事件参数类
24       {
25              public readonly double _salary;
26              public MyEventArgs(double salary)
27              {
28                     this._salary = salary;
29              }

30       }

31
32       public class HumanResource
33       {
34              public void SalaryHandler(object sender,MyEventArgs e)          //事件处理函数,其签名应与代理签名相同
35              {
36                     Console.WriteLine("Salary is {0}",e._salary);     //只是打印一行字而已
37              }

38
39              public static void Main()
40              {
41                     Employee ep = new Employee();
42                     HumanResource hr = new HumanResource();
43                     MyEventArgs e = new MyEventArgs(123.40);
44                     ep.OnSalaryCompute+=new SalaryCompute(hr.SalaryHandler);       //注册
45                     for (; ; )
46                     {
47                            Thread.Sleep(1000);      //让程序“睡”一秒
48                            ep.FireEvent(e);        //触发事件
49                     }

50                     //Console.Read();
51              }

52       }

53}

54

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

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

相关文章

学习vue.js 第一天

最近听到很多人都在用Vue.js ,我也想凑凑热闹,来个入门 啥的 ,要不以后人家说,啥都不知道,多low 看到官网 是这样介绍Vue.js Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重…

【数据库学习】——从零学习SQL语句(含SQL数据类型、SQL语句实例操作)

目录 ​ 0、创建数据库 1、调用指定的数据库 2、创建数据表 2.1、SQL数据类型 1).字符型数据: 3).整数型数据 4).精确小数型数据 5).近似数值类型 6).货币型数据 7).位类型数据 2.2…

第一次面试实习生经历

面的.net方向的 1,研究的方向,有没有看过相关论文,了解下前沿技术、国内外发展现状。云存储安、云计算。没有了解过相关内容。没有聊多少,是自己知识上的欠缺。曾经有想过看看相关内容。研究下云计算相关知识。但到如今没有付诸实…

struts2学习笔记(常见错误)

1、由于笔者使用的时最新的struts2 (version 2.5.14.1),之前下载的是all , 一直配置不上,然后查了google才下载的min版本。 这里面有配置struts2需要的必备的jar包,而至于上面的all里面lib里面的jar包实在太多,虽然我…

探寻C#事件本质1

我最先在学习C#事件的时候,阅读了许多书籍,但总是不能对事件建立起一个比较清晰的概念,对其内部机制和原理也是似是而非,因为这些书籍在描述事件的时候总是夹杂许多其他不能理解的抽象术语,相信许多初学者都有这样的感…

C#图解教程 第十二章 数组

数组数组定义重要细节数组的类型数组是对象一维数组和矩形数组实例化一维数组或矩形数组访问数组元素初始化数组显式初始化一维数组显式初始化矩形数组快捷语法隐式类型数组综合内容交错数组声明交错数组快捷实例化实例化交错数组比较矩形数组和交错数组foreach语句迭代变量是只…

【数据库学习】——windows、MySQL构建新闻管理系统(控制台版)

学习记录:【Python项目实战】PythonMySQL开发新闻管理系统全集_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Qb4y1b75q?p2&spm_id_frompageDriver 目录 一、项目介绍 1、项目结构 2、系统部分功能提前展示 3、项目流程图 4、项目设计的数据库以及…

matlab张量工具初步

最近从桑迪亚实验室下载了张量工具包。但是不太会用。 很多网上的方法, addpath(pwd) cd met; addpath(pwd) savepath Mones(4,3,2); Xtensor(M); Xtensor(rand(5,1)) Ytensor(rand(4,3,1)) Xtenrand([4 3 2]) X.size %*************************** Rsptenrand([5 4…

微信红包API接口(PHP)

发布时间:2015年2月25日 / 分类:WEB开发,PHP / 74,825 / 241 ℃ 根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析。 红包接口调用请求代码,所有请求参数为必填参数与文档对应: 1234567891…

2016年个人技术总结(前端)

自我总结 参与项目 备注:[☆-表示比较吊的项目,-从头开始做,^-中间加入项目] 神马生活(微信公众号商城)[^] 神马学院[] <!------跳槽线--------> 大数据套件[☆][^] fable数据营销平台(加入新功能&#xff0c;交互)[^] fit问卷系统[] fit投放系统[] fit画像[^] 理财通点击…

浅谈OpenCV[轉]

OpenCV是一个由Interl公司支持的开源机器视觉库&#xff0c;关于它的介绍&#xff0c;网上随便一搜就车载斗量。这里我不谈OpenCV的主要内容&#xff0c;而是将这段时间来对它的使用心得作个简单介绍&#xff0c;以启发打算用这个库的朋友的思路&#xff0c;与大家一起来分享。…

【pyqt5学习】——tablewidget控件学习

目录 1、Table Widget 1.QTableWidget不能在mainwindow中随主窗口的大小变化&#xff1f; 2.将表格变为禁止编辑&#xff1a; 3.设置表格为整行选择 4.单个选中和多个选中的设置&#xff1a; 5.表格表头的显示与隐藏 6.对表头文字的字体、颜色进行设置 7.在单元格里加入…

吴忠军 - 如何理解马云所说的月入两三万,三四万的人最幸福?

这句话源于一段两分钟的视频&#xff0c;马云的一次阿里内部会议演讲。 马云坦承&#xff0c;自己从第一天起就没想过当首富&#xff0c;还为此稀释公司持股&#xff0c;“没想到把自己的股份降到8%&#xff0c;还是有那么多&#xff0c;这是我没有想到的。” 在马云看来&#…

iOS小知识点(非UI部分)

1。 _cmd 表示当前方法的SEL指针&#xff0c; - (void)putString{} 对于这个函数_cmd 等效于selector(putString)转载于:https://www.cnblogs.com/dongfangchun/p/5341599.html

jQuery 操作 CSS

jQuery 拥有若干进行 CSS 操作的方法。我们将学习下面这些&#xff1a; addClass() - 向被选元素添加一个或多个类removeClass() - 从被选元素删除一个或多个类toggleClass() - 对被选元素进行添加/删除类的切换操作css() - 设置或返回样式属性转载于:https://www.cnblogs.com/…

彩色CCD相机工作原理

原理 黑白&#xff08;单色&#xff09;相机 CCD原理并不复杂。我们可以把它想象成一个顶部被打开的记忆芯片。因此光束可以射到记忆单元中。根据"光电效应”&#xff0c;这些光束在记忆单元中产生负电荷&#xff08;下图中右上部分&#xff09;。 曝光后&…

Linux 系统常用命令汇总(二) vi 文本编辑

文本编辑vi命令作用文件名编辑文本文件&#xff0c;若文件不存在同时创建该文件Ctrlf向后翻一页Ctrlb向前翻一页Ctrld向后翻半页Ctrlu向前翻半页光标移动到下一行-光标移动到上一行数字空格光标向右移动n个字符0移动到本行首个字符处$ 移动到本行最后一个字符处H光标移动到屏幕…

图像处理与计算机视觉:基础,经典以及最近发展(2)图像处理与计算机视觉相关的书籍

1. 数学 我们所说的图像处理实际上就是数字图像处理&#xff0c;是把真实世界中的连续三维随机信号投影到传感器的二维平面上&#xff0c;采样并量化后得到二维矩阵。数字图像处理就是二维矩阵的处理&#xff0c;而从二维图像中恢复出三维场景就是计算机视觉的主要任务之一。这…

【HTML学习】——HTML常见标签属性和方法介绍

目录 1、HTML分块--------< div> 2、HTML段落--------< p> 3、HTML标题--------< h1>…< h6> 4、HTML链接--------< a> 1)< a href“http://www.baidu.com”>百度< /a>&#xff08;点击百度&#xff0c;直接跳转到网页&#xf…

开发者应警惕的七种糟糕职业规划错误

那些心灵鸡汤式的说辞总爱美化失败&#xff1a;失败是成功之母啦、失败使人成长啦、别畏惧失败等等。但事实上&#xff0c;这种思路在软件开发领域也许并不适用——至少不完全适用。每位开发者在职业生涯中都不可避免会遭遇失败&#xff0c;但为什么不从他人的经验中汲取教训来…