.net框架读书笔记---事件(一)

CLR的事件模型是建立在委托(delegate)这一机制上面的;

先描述一个场景,我们希望设计一个电子邮件应用程序,当一个电子邮件消息到达时,用户可能希望将该消息转发给一个传真机(Fax)或者一个寻呼机(Pager),在设计该应用程序时,假设首先设计一个名为MailManager的类型接受发进来的电子邮件,然后再为MailMagager类型定义一个名为MailMsg的事件。其他类型(例如Fax和Pager)则可以登记该事件。当MailManager收到一个新的电子邮件时,它会触发该事件,将该消息发给每一个登记的对象,各个对象则可以按照期望的方式来处理该消息。

一、事件发布

下图演示了一个新邮件到达时发生的事情(图比较粗糙):

.net框架读书笔记---事件(一)

mark:1,fax对象登记MailManager的MailMSG事件;

   2,Pager对象登记MailManager的MailMSG事件;

     3,新的邮件到达;

         4,MailManager将通知发送给所有登记的对象,这些对象将按照自己的方式处理邮件消息;

首先来看MailManager的定义:

 

.net框架读书笔记---事件(一) 代码
   
     
/// <summary>
/// MailManager 的摘要说明
/// </summary>
public class MailManager
{
public MailManager()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

/// <summary>
/// 定义事件信息的类型,事件的附件信息
/// </summary>
public class MailMsgEventArgs : EventArgs
{

public MailMsgEventArgs( string from, string to, string subject, string body)
{
this .from = from;
this .to = to;
this .subject = subject;
this .body = body;
}
public readonly string from, to, subject, body;


}
// 委托类型定义了接收者必须实现的回调方法原型
public delegate void MailMsgEventHandler( object sender, MailMsgEventArgs args);

// 事件成员
public event MailMsgEventHandler MailMsg;

/// <summary>
/// 负责通知事件的登记对象
/// </summary>
/// <param name="e"></param>
protected virtual void OnMailMsg(MailMsgEventArgs e)
{
if (MailMsg != null )
{
MailMsg(
this , e);
}
}

public void SimulateArrivingMsg( string from, string to, string subject, string body)
{
// 构造一个对象保存希望传递给通知者的信息
MailMsgEventArgs e = new MailMsgEventArgs(from, to, subject, body);

OnMailMsg(e);
}
}

 

 

对MailManager做一个总结:

  • 1,定义一个类型用于保存所有需要发送给事件通知接收者的附加信息(MailMsgEventArgs),当的那一一个不需要传递任何额外数据的事件时,可直接使用EventArgs.Empty;
  • 2,定义一个委托类型,用于与指定事件触发时被调用的方法的原型,第一个参数为Object类型,其指向发送通知的对象,第二个参数为一个继承自EventArgs的类型,其中包含所有通知接收者需要的附加信息;
  • 3,定义一个事件成员,本例中,事件名称是MailMsg,该事件类型为MailMsgEventHandler,其含义是所有事件的接受者必须提供一个原型和MailMsgEventHandler相匹配的回调方法;
  • 4,定义一个受保护的虚方法,负责通知事件的登记者,当一个新邮件到达时,OnMialMsg方法会被调用,该方法接受一个经过初始化的MailMsgEventArgs对象(包含事件的附件信息),继承自MailManager的类型需要重写OnMailMsg方法,使得派生类可以按照自己的逻辑执行事件;
  • 5,定义一个方法,将输入转化为期望的事件,这样会导致事件被触发;

二,侦听事件

 

.net框架读书笔记---事件(一) 代码
   
     
/// <summary>
/// Fax 的摘要说明
/// </summary>
public class Fax
{
public Fax()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 将MailManager对象传递给构造函数
/// </summary>
/// <param name="mm"></param>
public Fax(MailManager mm)
{
mm.MailMsg
+= new MailManager.MailMsgEventHandler(FaxMsg);
}

void FaxMsg( object sender, MailManager.MailMsgEventArgs args)
{
// Sender表示MailManager对象

// args代表MailManager希望提供的附加信息
Console.WriteLine( " Faxing mail message: " );
Console.WriteLine(
" From:{0}\n To:{1}\n Subject:{2}\n Body:{3}\n " ,args.from,args.to,args.subject,args.body);
}

/// <summary>
/// 注销事件
/// </summary>
/// <param name="mm"></param>
public void Unregister(MailManager mm)
{
MailManager.MailMsgEventHandler callback
= new MailManager.MailMsgEventHandler(FaxMsg);
mm.MailMsg
-= callback;
}
}

睡觉了。。。。。。。。。。。。。

你可能感兴趣的:(.net)