C#事件委托

今天学到事件,看完这一章节感觉很困惑书本说的繁琐难明,然后自己在网上看了一些讲解大概地弄懂怎么去定义一个事件、利用方法触发这个事件、利用委托来绑定对事件进行处理的方法。

        假设有一个类(MailManager)它负责接收电子邮件,MailManager类公开一个NewMail事件,当接收到新的邮件时会触发NewMail事件,造成邮件分发给邮件处理对象(Fax类和Pager类的对象)。

  第一步:定义类型来容纳邮件所有需要发送给邮件处理对象(Fax类和Pager类的对象)的信息;

  class NewMailEventArgs:EventArgs// 
    {
        private string from;//邮件发出人
        private string to;//邮件收取人
        private string subject;//邮件主题
        public NewMailEventArgs(string from,string to,string subject)
        {
            this.from = from;
            this.to = to;
            this.subject = subject;
        }
        public string From{get{return from;}}
        public string To{get{return to ;}}
        public string Subject{get{return subject;}}
    }

 第二步:定义委托类型

 delegate void MyEventHandler(NewMailEventArgs e);//定义委托类型
 //CLR的事件模型是建立在委托的基础上的
 //通俗的讲这里定义的委托类型作用在于把事件成员和事件处理方法在在不同的类中绑定一起

第三步:MailManger类定义事件成员

  class MailManger
    {
        public event MyEventHandler NewMail;//创建事件成员
        public void OnNewMail(NewMailEventArgs e)//触发事件的方法,收到新邮件
        {
            if (NewMail != null)
            {
                NewMail(e);
            }
        }
    }

第四步:Fax类和Pager类中定义事件处理方法

  class Fax
    {
        public void Mail(NewMailEventArgs e)
        {
            Console.WriteLine("邮件发送人:"+e.From+"  收件人"+e.To+"  邮件标题"+e.Subject);
            Console.WriteLine("Fax邮件正在处理中!!!!!!!");
        }
    }
    class Pager
    {
        public void Mail(NewMailEventArgs e)
        {
            Console.WriteLine("邮件发送人:" + e.From + "  收件人" + e.To + "  邮件标题" + e.Subject);
            Console.WriteLine("Pager邮件正在处理中!!!!!!!");
        }
    }

Fax类和Pager类接收的事件通知信息是一样的,但是它们的处理方法实现可以不同。

模拟收到邮件:

 MailManger mail = new MailManger();
            NewMailEventArgs e = new NewMailEventArgs("me","微软","微软人类的希望!!!");//邮件信息
            Fax fax = new Fax();
            Pager pager = new Pager();
            mail.NewMail += new MyEventHandler(pager.Mail);//绑定事件与事件处理方法
            mail.NewMail += new MyEventHandler(fax.Mail);
           mail.OnNewMail(e);//收到邮件   触发事件   调用事件处理方法


你可能感兴趣的:(C#事件委托)