C#事件

C#事件实现步骤

1、定义类型容纳所有发送给事件通知接收者的附加信息

事件引发时,引发事件的对象可能希望向接收事件通知的对象传递一些附加信息。这些附加信息需要封装到它自己的类中。根据约定,这个类应该派生自 System.EventArgs,且类名应该以 EventArgs结束。

    internal class NewMailEventArgs:EventArgs
    {
        private readonly string m_from, m_to, m_subject;
        public NewMailEventArgs(string from,string to,string subject)
        {
            m_from = from;
            m_to = to;
            m_subject = subject;
        }
        /// <summary>
        /// 发件人
        /// </summary>
        public string From { get {return m_from;} }
        /// <summary>
        /// 收件人
        /// </summary>
        public string To { get {return m_to;} }
        /// <summary>
        /// 主题
        /// </summary>
        public string Subject { get {return m_subject;} }
    }

2、定义事件成员

事件成员使用C#关键字 event定义,其中, NewMail是时间名称,事件成员的类型是 EventHandler

    internal class MailManager
    {
        //2、定义事件成员
        public event EventHandler<NewMailEventArgs> NewMail;
    }

3、定义负责引发事件的方法来通知事件的登记的对象

    internal class MailManager
    {
        //2、定义事件成员
        public event EventHandler<NewMailEventArgs> NewMail;
        //3、定义负责引发事件的方法来通知事件的登记的对象
        protected virtual void OnNewMail(NewMailEventArgs e)
        {
            //通知登记的对象
            NewMail?.Invoke(this, e);
        }
    }

4、定义方法将输入转化为期望事件、也可以是属性

    internal class MailManager
    {
        //2、定义事件成员
        public event EventHandler<NewMailEventArgs> NewMail;
        //3、定义负责引发事件的方法来通知事件的登记的对象
        protected virtual void OnNewMail(NewMailEventArgs e)
        {
            //通知登记的对象
            NewMail?.Invoke(this, e);
        }
        //4、定义方法将输入转化为期望事件
        public void SimulateNewMail(string from, string to, string subject)
        {
            NewMailEventArgs e = new NewMailEventArgs(from, to, subject);
            OnNewMail(e);
        }
    }

5、设计侦听事件类型

internal sealed class Fax
    {
        public Fax(MailManager mm)
        {
            //注册回调方法
            mm.NewMail += FaxMsg;
        }
        //事件处理方法
        private void FaxMsg(object sender, NewMailEventArgs e)
        {
            Console.WriteLine($"From = {e.From},To = {e.To},Subject = {e.Subject}");
        }

        //注销对事件的订阅
        public void Unregister(MailManager mm)
        {
            mm.NewMail -= FaxMsg;
        }
    }

本文参考书籍 CLR via C#

posted @ 2023-01-07 13:13  修行的蜗牛  阅读(117)  评论(0编辑  收藏  举报