.net框架笔记(六)之--------一

第十一章 事件

 一.

定义了事件成员的类型允许类型(或类型的实例)在某些特定事情发生的时候通知其他对象.意味着类型为我们提供了以下三种能力:

1.允许对象登记该事件

2.允许对象注销该事件

3.允许定义事件的对象维持一个登记对象的集合,并在某些特定的事情发生时通知这些对象

例:当一个电子邮件消息到达时,用户可能希望将该消息转发给一个传真机(Fax)或一个寻呼机(Pager).

我们首先会设计一个名为MailManger的类型负责接受发进来的电子邮件消息.然后再为MailManger类型定义个名为MailMsg的事件.其他类型(如Fax)则可以登记该事件.当MailManger收到一个新的电子邮件消息时,它会触发该事件,将消息分给每一个登记对象.

 

首先:应用程序通过创建一个MailManger的实例来进行初始化.其次,MailManger提供了一个MailMsg事件.当Fax或Pager对象被构造时,它们将自己登记到MailManger的MailMsg事件上,这样在新的电子邮件消息到达的时候,MailManger将知道要通知Fax和Pager对象.当MailManger收到一个新的电子消息时,它会触发MailMsg事件,从而使所有的登记对象都有机会以它们期望的方式来处理新消息.

代码如下:

定义一个MailManger类

 

Code

 

对于上面代码中标记的数字解释,我们进行分析:

1,定义一个类型用于保存所有需要发送给事件通知接受者的附加信息

注意:EventArgs类型在FCL中定义如下:

Code

该类型的实现非常简单,它仅仅是作为一个让其他类型继承的基类型而出现的.许多事件都没有额外的信息需要传递.如,当一个Button通知它的登记接受者自己被按下时,简单地调用回调方法就已经足够了。当我们定义个不需要传递任何额外数据的事件时,可以直接使用EventArgs.Empty,而不用再构造新的EventArgs对象.

2.定义一个委托类型,用于指定事件触发时被调用的方法原型.

方法接受两个参数,第一个为Object类型,其指向发送通知的对象.第二个参数为一个继承自EventArgs的类型,其中包含所有通知接受者需要的附加信息.

如果我们定义的事件没有需要传递给事件接受者的附加信息,我们便不必定义新的委托类型,直接使用FCL中的System.EventHandler,并将EventArgs.Empty传递给第二个参数即可.

EventHandler的原型如下:

Code

 

3.定义一个事件成员

事件的名称为MailMsg.该事件的类型为MailMsgEventHandler,其含义为所有事件通知的接受者都必须提供一个原型和MailMsgEventHandler相匹配的回调方法.

4.定义一个受保护的虚方法,负责通知事件的登记对象

当一个新的电子邮件信息到达时,OnMailMsg方法会被调用,该方法接受一个经过初始化的MailMsgEventArgs对象(其中包含事件的附加信息).该方法应该首先检查是否有对象登记了事件,如果有,则触发事件.

5.定义了一个方法.将输入转化为期望的事件

二:该是展示怎样定义个类型来使用MailManger提供的MailMsg事件的时候了

 

Code

 

其中的:

mailManger.MailMsg += new MailManger.MailMsgEventHandler(FaxMsg);

可以这样理解:

new MailManger.MailMsgEventHandler(FaxMsg)这是构造一个指向FaxMsg回调方法的MailMsgEventHandler委托实例.mailManger.MailMsg 是MailManger的MailMsg事件.它通过委托实例,登记了事件.也可以写成这样:

mailManger.add_MailMsg(new MailManger.MailMsgEventHandler(FaxMsg));

下面是应用程序:

 

Code

 

 

 

posted @ 2008-09-28 20:43  打瞌睡的耶稣  阅读(287)  评论(0)    收藏  举报