学习.net--事件原理

Posted on 2004-10-18 22:40  鲁旭  阅读(1500)  评论(3编辑  收藏  举报
   今天在看《.net 框架程序设计》的事件原理,抄了个例子:
发布事件:
using System;
class MailManager
{
    
//在mailmanager内部定义MailMsgEventArgs类型
    public class MailMsgEventArgs:EventArgs
    
{
        
public readonly String from,to,subject,body;
        
//1.传递给事件接收者的类型定义信息
        public MailMsgEventArgs(String from,String to,String subject,String body)
        
{
            
this.from=from;
            
this.to=to;
            
this.subject=subject;
            
this.body=body;
        }


    }


    
//2.下面的委托类型定义了接收者必须实现的回调方法原型
    public delegate void MailMsgEventHandler(Object sender,MailMsgEventArgs args);
    
    
//3.事件成员
    public event MailMsgEventHandler MailMsg;

    
//4.下面的受保护虚方法负责通知事件的登记对象
    protected virtual void OnMailMsg(MailMsgEventArgs e)
    
{
        
if(MailMsg != null)
        
{
            MailMsg(
this,e);
        }

    }


    
//5.下面的方法将输入转化为期望的事件,该方法在新的信息到达时被调用
    public void SimulateArrivingMsg(String from,String to,String subject,String body)
    
{
        
//构造一个对象保存希望传递给通知接收者的信息
        MailMsgEventArgs e=new MailMsgEventArgs(from,to,subject,body);
        
//调用虚方法通知对象时间已经发生
        
//如果派生类型没有重写该虚方法,对象将通知所有的登记的事件侦听者
        OnMailMsg(e);
    }



}


侦听事件:
using System;
class Fax
{
    
/// <summary>
    
///将MailManager对象传递给构造器 
    
/// </summary>
    
/// <param name="mm"></param>

    public Fax(MailManager mm)
    
{
        
//构造一个指向FaxMsg回调方法的MailMsgEventHandler
        
//委托实例。然后登记MailManager的MailMsg事件
        mm.MailMsg+=new MailManager.MailMsgEventHandler(FaxMsg);
    }


    
/// <summary>
    
/// MailManager将调用该方法来通知Fax对象接收到一个新的电子邮件信息
    
/// </summary>
    
/// <param name="sender">表示MailManager对象,如果期望和事件的触发着通信,将会用到该参数</param>
    
/// <param name="e">表示MailManager对象希望提供的一些附加事件信息</param>

    private void FaxMsg(Object sender,MailManager.MailMsgEventArgs e)
    
{
        Console.WriteLine(
"Faxing mail message:");
        Console.WriteLine(
"From :{0}\n To:{1}\n Subject:{2}\n Body:{3}\n",e.from,e.to,e.subject,e.body);
    }

    
/// <summary>
    
/// 注销事件
    
/// </summary>
    
/// <param name="mm"></param>

    public void Unregister(MailManager mm)
    
{
        
//构造一个指向FaxMsg回调方法的MailMsgEventHandler委托实例
        MailManager.MailMsgEventHandler callback=new MailManager.MailMsgEventHandler(FaxMsg);
        
//注销MailManager的MailMsg事件
        mm.MailMsg-=callback;
    }

}

Copyright © 2024 鲁旭
Powered by .NET 8.0 on Kubernetes