C#事件 的讲解

一、事件的本质

事件是软件系统里的两个子系统之间,或者两个模块之间,或者两个对象之间发送消息,并处理消息的过程。在面向对象的世界里,就可以统一认为是两个对象之间的行为。

两个对象之间发送的这种消息,对发送方来讲是产生一个事件,对接受方来讲是需要处理某个事件。这种消息可以是用户操作产生的或者软件系统里的某个对象产生的。

9922720e0cf3d7ca855d4981f21fbe096a63a99a.jpg
对象之间的事件处理

从上图可见,对象一产生一个事件,这个事件发生以后需要对象二执行某种动作。这就是事件机制。对象一是事件的产生者,或者发送者;对象二是事件的接收者或者订阅者。对象一产生某种消息,需要对象二响应并处理这给消息,这就是事件的本质。

以往的很多软件系统都在采用事件机制处理很多问题。例如从最本质的计算机体系中的软中断处理,到masm中的jump,到c/c++中的回调函数等等。只不过越高级的软件系统处理事件或者其提供的很多处理方法越接近人的思维,而越远离机器思维。构建软件系统的方法从本质上就是从机器思维走向人的思维的过程。

 

二、事件机制的好处

1、直接调用

采用事件机制有什么好处?事件发送者为什么不直接调用事件接受者提供的处理函数呢?

d50735fae6cd7b893fb54c740f2442a7d8330e6f.jpg
调用机制

如果所示,两个对象之间的调用机制。对象B调用对象A的方法,可以通过函数指针或者跳转(汇编语言)等实现。这种方法造成的结果是AB的紧密耦合,即BA有很强的依赖性。可以看成B是事件的发布者,A是事件的响应和处理者。不过这种机制用事件机制解释从理论上就比较牵强了。同一种事物,其实现的思想不一样。

现在假设有个对象C也要响应B的事件。那么,按照上面的这种机制,需求修改对象B的代码,调用对象C的方法。这样机制造成了非常强的依赖关系。代码的修改和扩展非常麻烦。如果对象越多,这种关系越多,整个系统越复杂。如果一个系统里面对象很多,这种依赖关系也很多的情况下,这种调用关系就会十分复杂,对系统的健壮性和优良性会造成影响。

2、回调机制

如果按照c#的委托思想,B需要事先提供对事件处理函数的某些回调指针。这样,其它对象,例如A和C就去修改它的回调指针,把自己的方法联系到上面。但是它们之间的耦合关系就比上面简单了。
f9dcd100baa1cd11f04504d7b912c8fcc2ce2d51.jpg
回调机制

回调机制的思想已经比较接近委托的概念。其实委托在本质上也就和回调指针差不多,只是概念上更加高级。对象B作为事件的发布者,事先定义一些回调函数指针,然后在本地合适的地方调用这些指针指向的函数。而事件订阅者或者处理者AC所作的就是让给这些空指针赋值,把自己的事件处理方法赋给它,从而实现B调用AC的方法。

C++ 中与委托最为相似的是函数指针。然而,函数指针只能引用静态函数,而委托可以引用静态方法和实例方法。当委托引用实例方法时,委托不仅存储对方法入口点的引用,还存储对为其调用该方法的类实例的引用。与函数指针不同,委托是面向对象、类型安全并且安全的。

 

转载于:https://www.cnblogs.com/jilodream/archive/2012/11/01/4222776.html

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

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

相关文章

phpMyAdmin密码设置

2019独角兽企业重金招聘Python工程师标准>>> 在使用phpMyAdmin操作数据库时,首先需要设置mysql的root用户的密码。具体操作参考前一篇博文。设置完mysql的root密码之后,需要对phpMyAdmin的登录进行一些配置。 未经配置的phpMyAdmin很不安全&a…

openjdk:8u22-jre-alpine在java开发中的NullPointerException错误解决方案

问题描述 ** 在SpringBoot项目中使用了Ureport报表组件, 打包发布部署到docker中启动报错 ** java.lang.NullPointerExceptionat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:…

例程:Linux下的socket演示程序2

本程序完成学生信息注册功能&#xff08;将学生信息存放到服务器&#xff09;。 服务器端&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.…

关于VC++6.0中getline函数的一个bug

关于VC6.0中getline函数的一个bug 最近在调试程序时&#xff0c;发现getline函数在VC6.0和其他编译器上运行结果不一样&#xff0c;比如有如下这段程序&#xff1a; #include <iostream> #include <string>using namespace std;int main(void) {string str;getline…

Nagios添加主机监控失败-故障小结

如果在/usr/local/nagios/etc/object 下自建hosts.cfg和services.cfg文件定义主机和服务后&#xff0c;在web界面只能查看到localhost主机&#xff0c;而看不到所要检测主机&#xff0c;这时候就要查看有没有在/usr/local/nagios/etc/nagios.cfg文件中加入自建文件hosts.cfg和s…

postgresql 数据表【转】

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2011/12/16/2290803.html 一、表的定义&#xff1a; 对于任何一种关系型数据库而言&#xff0c;表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。 1. 创建表&#xff1a; CREATE…

linux文本文件和win文本文件的格式互换

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 有时在WIN下编辑好的脚本文件上传到LINUX服务器中不能正常执行&#xff0c;开始误认为是LINUX配置问题&#xff0c;后来才发现是WIN与LINUX存储文件时的换行符标志不同造成的。在DOS使用的换行符为 ^M$&…

抽取网络信息进行数据挖掘 建立语料库

最近的实习项目需要做一个大数据库&#xff08;语料库&#xff09;&#xff0c;采集博客、微博、问答库的信息。将数据库的内容进行训练&#xff0c;最后应该是做成一个类似中文siri的模型吧。 第一步新闻抓取器已经稳定运行了&#xff0c;基本原理用的是爬虫去爬新闻门户网站的…

Hive hang without response

前些天Hive查询的接口一直超时报警&#xff0c;登录上去查看发现这个超时报警的曲线很有规律&#xff0c;每个小时开始就出现&#xff0c;过了大约3分钟左右就好了.在这个期间里&#xff0c;也发现hive根本就执行不了&#xff0c;完全hang住了&#xff0c;机器负载&#xff0c;…

四旋翼无人机调研结果

P.S&#xff1a;作者曾在大学某次小班课上看到该视频&#xff0c;深深被震撼了&#xff0c;因此对无人机念念不忘。 恰逢某课程要求讲解自己喜欢的领域的内容&#xff0c;因此对四旋翼无人机进行了调研。

java常用方法

public static int byte2int(byte b) {int i b & 0x07f;if (b < 0) {i | 0x80;}return i; } //运行代码 function runEx(cod1) {coddocument.getElementById(cod1)var codecod.value;if (code!""){var newwinwindow.open(,,); newwin.opener null newwin.…

MySQL 计算两个时间的差值

TIMESTAMPDIFF(type,exp2,exp1) type:year,month,day,HOUR,min,second等 例如&#xff1a;select TIMESTAMPDIFF(SECOND,2012-10-1 2:0:0,2012-10-1 2:0:3) 结果&#xff1a;3.转载于:https://www.cnblogs.com/ja-net/archive/2012/11/05/2754724.html

【原】通过npm script运行webpack的原理

原理&#xff1a;在项目中&#xff0c;局部安装依赖&#xff0c;依赖如果有创建命令的情况下会在node_modules/.bin目录创建软链接&#xff0c;pack.json默认读取到.bin下的命令。 如有理解不对&#xff0c;请各位大神纠正 转载于:https://www.cnblogs.com/luckyXcc/p/11332543…

Android 弹出有确认按键的对话

//弹出对话框--------------------------------------------------private void openDialog(String strMsg, String strTitle){new AlertDialog.Builder(this).setTitle(strTitle).setMessage(strMsg).setPositiveButton("确认",new DialogInterface.OnClickListener…

选购四轴飞行器的部件

内容截于&#xff1a;http://www.loveuav.com/article-191-1.html

神马是线程?PHP对其具体的应用?应用在哪里?

未解决 转载于:https://www.cnblogs.com/qin520/archive/2012/11/06/2757859.html

【原】webpack--loaders,主要解释为什么需要loaders和注意事项

Why需要loaders? webpack开箱即用只支持JS和JSON两种文件类型&#xff0c;但是比如css、less&#xff0c;还有目前市场上比较新的语法糖jsx&#xff0c;怎么处理呢&#xff1f; 通过Loaders去支持其他文件类型并且把它们转化为有效的模块&#xff0c;并且可以添加到依赖图中。…

重复编辑命令行

为什么80%的码农都做不了架构师&#xff1f;>>> 要想重复前面已经输入的命令&#xff0c;请按向上方向键。每按这个键一次&#xff0c;shell都会显示前一个命令行。要想重新执行所显示的命令行&#xff0c;请按回车键。按向下方向键&#xff0c;则可以沿着相反的方…

C语言宏定义函数

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 在软件开发过程中&#xff0c;经常有一些常用的代码段&#xff0c;这些常用的代码段既可以写成函数&#xff0c;也可以封装成宏定义。那么究竟是用函数好&#xff0c;还是宏定义好&#xff1f;这就要求我们…

壊小子的学习【日常阅读篇】(三)常规学习类图书

在上一篇职业相关图书中也提到过目前的职业方向&#xff0c;其中项目经理、产品经理是未来的发展方向&#xff0c;因此这类的书也就成为了常规类的学习用书。另外还包括的是工商管理类图书、心理学类、法律类以及外语类。 工商管理是准备续的本科&#xff0c;虽然是交钱就能拿到…