[C#参考]事件和委托的关系

前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别。

事件和委托很相似,事件就好像是被简化的针对特殊用途的委托。看下面的图:

结合前面说的委托的知识,事件的组件应该是这个样子的:

看到发布者必须有触发事件的代码,也就是必须为事件的调用留有接口,不能直接调用事件(不要觉得事件是委托类型的)。这里要强调的是事件是成员,是发布者的一个成员,它不是类型,它的类型是委托类型的

虽然事件是委托类型的,但是事件对委托做了一次封装,并且事件封装的委托是private的,所以是不能从发布者外部直接调用使用的,必须通过接口调用。

事件提供了对它的私有控制委托的结构化访问。与委托中的许多其他操作不一样,对于事件只可以添加、删除或者调用事件处理程序。

再看下面这幅图:

从这幅图中也能看到事件是发布者类的成员,它提供了对自己内部私有控制的委托的结构访问。

http://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

http://www.blogjava.net/hongzionline/archive/2008/07/28/145050.html

http://www.360doc.com/content/11/0719/10/654841_134444949.shtml

http://blog.csdn.net/chopper7278/article/details/3145000

http://www.cnblogs.com/kklldog/archive/2012/01/17/2324228.html

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

时间: 2024-10-25 13:49:27

[C#参考]事件和委托的关系的相关文章

事件和委托(Event vs. Delegate)-事件阉割版的Delegate

引言 关于事件和委托的文章看过很多,但总是记不完整.尤其是在给别人讲解的时候总是很零碎,所以在此整理一下,也供大家参考,很请大家不吝赐教. 本文从一个子类如何触发基类的事件(Event),引出事件和委托的共性和区别.再简单分析下背后原因,深层原因也给大家提供了部分参考资料.欢迎大家留言讨论.   问题 "如果我想在子类里触发父类的事件(Event)应该如何实现?"(可以先自己做下或者想下,再继续看您的做法是否也曾有我碰到技术误区)   问题分解为两步: 父类定义了一个事件(Event)

C#基础知识之事件和委托

本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 委托的引入:将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { EnglishGreeting(name); } public

从事件来看委托

事件是基于委托,为委托提供了一种发布/订阅机制,在dotNet到处都能看到事件,一个简单的例子就是在windows应用程序中,Button类提供了Click事件,这类事件就是委托,触发Click事件时调用的处理程序方法需要定义,其参数也是由委托类型定义的,事件模型可以用下图简要说明. 在这个模型中,事件的响应者通过订阅关系直接关联在事件拥有者的事件上,我们把这种事件模型或者CLR事件模型.因为CLR事件本质上是一个委托实例,我们暂且模仿CLR属性的说法,把CLR事件定义为一个委托类型实例的包装器

事件与委托

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易

[GUI] QT事件与X11的关系

做了一段时间linux下与QT事件相关的工作,经常会遇到X11,总是苦于无法完全理解其与linux以及QT事件之间的关系,所以用两篇文章来简单总结下linux中的图形管理和QT事件与X11的关系. <1> linux中的图形管理 <2> QT事件与X11的关系 1. Qt中的事件 参考自<C++ GUI Qt 4编程>中第7章给出的Qt事件定义及说明: Qt的事件(event)是由窗口系统或者Qt自身产生,用以响应所发生的各类事情.当用户按下或者松开键盘或者鼠标上的按键

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

C# 事件与委托的区别

C# 事件与委托的区别 先看一段程序 class Program { static void Main(string[] args) { Test obj = new Test(); obj.print += printout1; //绑定printout1方法 obj.print += printout2; //绑定printout2方法 obj.start(); } static void printout1() { Console.WriteLine("输出第一段字符串"); }

C#事件与委托详解【精华 多看看】

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只能指

关于事件、委托、被调用方法的详解

先上图: 大概就是这样,有5个radiobutton和5个fragment,要做的是选中按钮和页面的对应Show(). 然而,当执行到 radioButton[0].Checked = true; 之后,事件CheckedChange被触发,i的值会显示为5,提示数组越界. Why?这里就要涉及到关于事件→委托→被调用方法的关系问题:(以下均为个人理解) !即是:事件封装委托,委托指向方法! 关键点如下: 1.这里使用的是lambda表达式调用匿名方法,原理上也是一种委托,只是匿名方法原封不动地