c# 中的事件

1、C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器;

2、发送器不知道接收器的任何情况,但接收器有一个事件处理程序来处理这个事件(当事件发生时);那么发送器和接收器之间如何进行通信呢?用事件,用委托,简单地来理解把事件理解成消息即可。

先定义个委托,要使用的事件处理程序的签名(也就是函数类型,返回值,参数个数,参数类型等等)由这个委托定义,委托本质就是个函数指针,指向指令所在的内存区域。

     

      事件+=委托(事件处理程序)

      把这个事件委托给了事件处理程序

      至于事件处理程序的签名是怎么样的,由委托给出,EventHandler委托是由系统所定义的。

      所以总的流程,是这样的:

      1)先定义个委托,不一定在接收器的内部,在可见域即可

      2)在发送器类对象的内部来进行注册,进行委托,把事件和事件处理程序关联起来(事件处理程序可以是静态的,直接用;可以是非静态的,用实例化对象才能调用,因为这种成员函数是属于类实例对象的,只有实例化的对象调用才有意义,也可以理解成为,实例化对象之后才编译出这种函数的指令代码放在内存中,才能有效引用,这种是否和静态函数一样是否预先编译取决于编译器及系统的综合考量设计),在接收器方面,给出事件处理程序的实现。

3、

 

4、可给一个事件添加多个事件处理程序,仍类似于多播委托,多个事件处理程序的顺序是不一定的,所以就不能编写事件处理程序之间互相有顺序依赖的程序

 

 

5、一种简化写法,不必给出事件处理程序(消息处理函数),在事件委托给事件处理程序处,直接用入表达式给出事件处理程序的代码块

 

 6、

 

事件定义的时候,其语法形式需要指出所用的委托(一种类类型,一种函数指针的类型,带有签名检查,返回值,参数类型,参数个数等等),一般使用系统内置的委托,所以就不用单独给出了;

委托的参数用的是规定好的形式,void返回类型,两个参数,一个参数object sender,一个参数是有关事件的其他有用信息的类对象,可以是任意类类型,但是必须派生于EventArgs类(派生于的一个基类,为了多态扩展,可以使用任何未知类型,用一定义好的函数格式)

在接收器,给出满足这个委托格式(这个事件处理函数格式)的函数,也就是事件处理程序的实现即可。
本篇文章来源于:开发学院 http://edu.codepub.com/   原文链接:http://edu.codepub.com/2009/1209/18583.php

posted @ 2009-12-14 14:05  任飞儿  阅读(259)  评论(0编辑  收藏  举报