原文地址: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. Android内存优化(四)解析Memory Monitor、Allocation Tracker和Heap Dump

    相关文章 Android性能优化系列 Java虚拟机系列 前言 要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具.本篇就来介绍内存 ...

  2. HihoCoder1049 后序遍历 分治水题

    水题,是为了给难题(树形DP)做铺垫 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具——一棵由小球和木棍连接起来的二叉树! 小Ho对 ...

  3. Filter学习(二)Filter使用Decorator设计模式

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  4. Object-C 中的Selector 概念

    selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念. @selector(xxxx)的作用是找到名字为xxxx的方法.一般用于[a pe ...

  5. vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法

    一.下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C+ ...

  6. check sub-string in the string

    if "blah" not in somestring: continue

  7. DIV,CSS学习

    如何将页脚固定在页面底部 http://web.jobbole.com/10408/

  8. 容灾管理中的RTO与RPO的关系

    在灾难恢复方面,目前业界公认有三个目标值得努力.一是恢复时间,企业能忍受多长时间没有 IT,处于停业状态:二是网络多长时间能够恢复:三是业务层面的恢复.整个恢复过程中,最关键的衡量指标有两个:一个是 ...

  9. nginx+php测试时显示 502 bad gateway的解决方法

    http://www.apelearn.com/study_v2/chapter18.html 由于阿铭老师的PHP版本是 5.3的   我装了 5.5 测试出现了 502  错误 查看日志   借助 ...

  10. 自定义显示提示一段时间自动消失ShowMsgText控件

    public partial class ShowMsgText : Label { public string TextMsg { get { return Text; } set { timer1 ...