【转】C#事件、委托、回调的用法与区别
原文地址:http://blog.csdn.net/huang9012/article/details/38753305
事件包括:事件发送者、事件接收者和事件处理程序。
关于事件,我们首要知道的是事件的发送者必须知道发送什么类型的事件,以及相关
的事件参数。而事件的接收者必须了解其事件的处理方法必须使用的返回类型和参数
事件的发送者和事件的接收者都只关注事件而不是对方,这样对象就只需考虑自己,而不用
考虑其他对象。
例如:足球运动员踢球射门时,产生一个击球事件,但他并不用关心守门员是谁,他
只要关心自己踢球的角度、力度等事件参数,而守门员也一样,他只需关注如何接球即可。
足球运动员踢出球,产生一个击球事件,但是订阅该事件的可能并不只守门员,其他球员包括己
方和对方球员,甚至包括观众和裁判,他们都应该订阅该事件,因为球接下来会怎么样是未
知的,他们都应该做出相应的事件处理方法。
总之,一个事件总是由一个对象产生,但是一个事件可以由多个对象响应。
当多个对象订阅同一个事件时,IDE(Integrated Development Environment)就会把它们的事
件处理程序一个接一个地串起来关联到这个事件,并按照订阅顺序,先后执行。可以用+=增加事
件处理函数。
在上面中,我们一直讲事件触发时会调用对应的事件处理方法。但是,问题是他怎么知道调用
谁的事件处理方法。任何一个对象只要订阅了事件,他的是事件处理程序就会得到调用。然而
,事件对此该如何管理呢?
这就需要一个新的类型,叫做委托。
通过委托可以创建一个引用变量,但是并不是指向类的实例,而是指向一个类中的某个方法。
设计.NET事件的5步骤:
1):定义参数类型:从类型EventArgs派生出满足要求的事件参数类
2):定义事件处理者委托:与第一步相关该步一般被泛型委托取代了
3):定义事件成员:在自定义类中,由事件处理者委托定义一个或多个事件成员
4):触发事件:自定义类的引发事件方法中,通知所有事件订阅者
5):订阅事件:注册事件处理程序
参数object sender 是产生这个事件对象的一个引用,例如处理一个按钮的单击事件,sender就
表示别单击的这个按钮。
如果没有事件数据,则传递 Empty,而不要传递 null。
可能你会执着于这样的一个问题:既然有了委托,那么事件干什么用的呢?
显然,委托可以干很多事情,但是他不知道什么时候干,这时候就需要事件来驱动。
或许你还会纠结于这样的一个问题:那为什么不直接让事件自己直接去做呢?
这就得回归到面向对象的思想上面了,面向对象讲究专注,就是一个对象最好只专注
自己的本职工作就可以,其他的事情就由其他相关的对象自己完成。
你想想,如果你是个老板,你可以触发一个事件(相当于你有某件事情),但如果处理这个事件
还要让你自己去做,你会觉得很麻烦,于是你就可以让你的职员(委托)去执行这些事件处理程序,
你只要在办公室里等待回复就可以了,这样是不是轻松了许多!
可能你没有当老板的命,无法体会,但换个例子,假如你想要买一张火车票,在没有委托之前,
毫无疑问,你得自己前晚火车站买票,但有了委托后,你就轻松了,你只要上网点击订票发布
一个事件,你的委托就会直接帮你买票,而你就不用大老远的自己跑去买票了。
生活中的例子其实很多,我们的父母其实一直充当着委托这个角色,在这里,感激他们一下:你
们辛苦了。
之前,我们说足球运动员踢球时会产生一个击球事件,并把这个击球事件与守门员直接联系
起来,这其实是不准确的,但我只是为了说明事件的作用而已。
准确的说,击球事件应该是足球运动员和球的,而球和守门员之间的事件应该是球飞出的事件。
现在我们要讨论的是这个击球事件:
既然如此,
那么假设,球场还有别的球,你可能无意中 帮这些球也订购了由运动员引发的击球事件,这样
子会造成一个后果,足球运动员一踢球这些所有的球都飞出去了。
后果严重把!
下面是关于回调的一些定义:(Callback Method)
回调:一个对象将一个方法的引用(方法的引用用委托保存)传入另一个对象,使得只有他能返
回信息,这就是一个回调。
回调方法是一种在操作或活动完成时由委托自动调用的方法。
回调不同于事件,回调不能发布,不是类型,是一种设计模式,回调在两个类之间建立一种关系,
其中一个对象会自动对另一个对象做出反应,回调一般是私有的,保存回调的类对于谁能访问这个
回调有所控制,回调通常在对象的构造函数中设置。
本人粗略定义:简单的说就是将委托作为参数传递给某个特定对象。
这样,有了回调我们就可以避免上面非赛场上的球也飞出去的问题了。
【转】C#事件、委托、回调的用法与区别的更多相关文章
- 第九课-1 事件的状态Event 对象 ,事件,元素,节点的关系,事件委托currentTarget与target的区别
<ul> <li>1itme1</li> <li>2itme2</li> <li>3itme3</li> <l ...
- vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结
vue—你必须知道的 目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...
- 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...
- js事件委托
什么是事件委托:通俗的讲,onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 也 ...
- C++模拟C#事件委托机制(一)
原文来自于http://www.cnblogs.com/netssfy/articles/1652671.html 写了一段时间的C#代码后确实发现C#的事件委托非常好用.于是便想是否在C++中也能如 ...
- 事件委托能够优化js性能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...
- Javascript 笔记与总结(2-17)事件委托
[例]五子棋,单次点击为黑色,偶次点击为白色.e.target 的用法 <!DOCTYPE html> <html lang="en"> <head& ...
随机推荐
- HAWQ + MADlib 玩转数据挖掘之(二)——矩阵
矩阵是Madlib中数据的基本格式,通常是二维的.在Madlib中,数组的概念与向量类似,数组通常是一维的,是矩阵的一种特殊形式. 一.矩阵表示 MADlib为矩阵提供了两种表示形式:稠密和稀疏. 1 ...
- java入门学习(2)—基本数据类型
1.变量:定义变量:[数据类型] 变量名 = 赋值(这样定义的变量一般属于局部变量,放置在栈内存中): 2.标识符:可以有字母(可以使任意文字),数字,下划线,$等组成:但是不能以数字开头,不能是保留 ...
- mysql的master和slave同步方案
同步原理 master将改变记录到二进制日志(binary log)中 slave将master的binary log events拷贝到它的中继日志(relay log) slave重做中继日志中的 ...
- WIN7下配置和使用解压缩版MYSQL
最近mysql出了新的GA版本——mysql5.6.11,此版本windows64位下只有解压缩版,于是在win7上进行了配置.期间碰到了一些问题,在此记录一下. 一.环境 操作系统:WIN764位 ...
- [CF895E]Eyes Closed
luogu description 一个序列\(a_i\),支持一下两种操作. \(1\ \ l_1\ \ r_1\ \ l_2\ \ r_2\): 随机交换区间\([l_1,r_1]\)和\([l_ ...
- LG3953 逛公园
题意 策策同学特别喜欢逛公园.公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...
- asciidoctor 安装试用
备注: asciidoctor 是asciidoc 的增强,使用简单,模板比较丰富,对于持续集成方面的开发也是一个不错的工具 1. 安装 a. 环境准备 MRI Ruby 1.8.7, 1. ...
- Cucumber 之Gherkin
1.Gherkin简介: Cucumber是一个解释程序,就像ruby命令执行解释 .rb文件里的Ruby代码一样,Cucumber用来执行解释 .feature文件里的Gehrkin代码. 2. ...
- WINDOWS下kill进程的命令
相信大家都有用命令行(CMD)解决问题的习惯,起码我感觉自己在处理Windows系统故障时越来越离不开Windows PE了,今天我想介绍两个很实用的命令:Tasklist与Tskill.命令:Tas ...
- 【转】VC中MessageBox与AfxMessageBox用法与区别
原文网址:http://blog.csdn.net/holybin/article/details/28403109 一.MessageBox()用法 1.函数原型 Messagebox函数在Win3 ...