原文地址: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. 第九课-1 事件的状态Event 对象 ,事件,元素,节点的关系,事件委托currentTarget与target的区别

    <ul> <li>1itme1</li> <li>2itme2</li> <li>3itme3</li> <l ...

  2. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  3. 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

    委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...

  4. js事件委托

    什么是事件委托:通俗的讲,onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 也 ...

  5. C++模拟C#事件委托机制(一)

    原文来自于http://www.cnblogs.com/netssfy/articles/1652671.html 写了一段时间的C#代码后确实发现C#的事件委托非常好用.于是便想是否在C++中也能如 ...

  6. 事件委托能够优化js性能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...

  8. 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...

  9. Javascript 笔记与总结(2-17)事件委托

    [例]五子棋,单次点击为黑色,偶次点击为白色.e.target 的用法 <!DOCTYPE html> <html lang="en"> <head& ...

随机推荐

  1. 目标检测 - Tensorflow Object Detection API

    一. 找到最好的工具 "工欲善其事,必先利其器",如果你想找一个深度学习框架来解决深度学习问题,TensorFlow 就是你的不二之选,究其原因,也不必过多解释,看过其优雅的代码架 ...

  2. [Python] json 报错'xxx is not JSON serializable'的处理方法

    predictions = self.model.predict(x_data, verbose=0)[0] y_pred_idx = np.argmax(predictions) y_pred_pr ...

  3. Android 4.0 Camera架构分析之Camera初始化

    Android Camera 采用C/S架构,client 与server两个独立的线程之间使用Binder通信,这已经是众所周知的了.这里将介绍Camera从设备开机,到进入相机应用是如何完成初始化 ...

  4. boost split字符串

    boost split string , which is very convenience #include <string> #include <iostream> #in ...

  5. mysql在innodb索引下b+树的高度问题。

    B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...

  6. 模块(Modules)

    一.引入模块 模块:当编写更大的应用程序时,所有的代码肯定会分成多个文件,这样便于维护,另外已经编写好的函数和对象在被多个程序中使用时,不用把函数和对象拷贝到每个程序中. 模块支持以上功能,在Pyth ...

  7. iOS Webview打开不受信的URL

    在我们开发过程中经常会碰到直接访问开发人员的私有地址, 这样在app 上是无法打开指定的网页的. 在iOS中需要对WKWebView 进行如下设置: 1.在工程的Plist 文件中添加一下选项 App ...

  8. 【Netty】netty学习之nio了解

    [一]五种IO模型: (1)阻塞IO(2)非阻塞IO(任务提交,工作线程处理,委托线程等待工作线程处理结果的同时,也可以做其他的事情)(3)IO复用模型.(委托线程接收多个任务,将任务提交给工作线程. ...

  9. hessian协议原理

    Hessian 原理分析 一.      远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . t ...

  10. ballerina 学习七 object 创建&& 初始化

    在 ballerina 总中object 是一个包含public private 类型字段同时包含函数,需要开发人员进行自定义类型以及行为 说白了,就是类似面向对象的class 基本使用 代码 imp ...