C# 事件

复制代码
/// <summary>
    /// 事件数据
    /// </summary>
    internal sealed 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; } }
    }
    internal class MailManager
    {
        private EventHandler<NewMailEventArgs> m_NewMail;
        // 事件属性
        public event EventHandler<NewMailEventArgs> NewMail
        {
            add
            {
                m_NewMail += value;
            }
            remove
            {

                m_NewMail -= value;
            }
        }
        protected virtual void OnNewMail(NewMailEventArgs e)
        { 
            //EventHandler<NewMailEventArgs> temp =
            // Interlocked.CompareExchange(ref m_NewMail, null, null);
            //if (temp != null) temp(this, e);

            if (m_NewMail != null)
            {
                m_NewMail.Invoke(this,e);
            }
        }
        /// <summary>
        /// 模拟新邮件
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="subject"></param>
        public void SimulateNewMail(String from, String to, String subject)
        {
            NewMailEventArgs e = new NewMailEventArgs(from, to, subject);
            OnNewMail(e);
        }
    }
    /// <summary>
    /// 传真
    /// </summary>
    internal sealed class Fax
    {
        public Fax(MailManager mm)
        {     
            mm.NewMail += FaxMsg;
        }
        private void FaxMsg(Object sender, NewMailEventArgs e)
        {
            Console.WriteLine("传真邮件信息:");
            Console.WriteLine("   From={0}, To={1}, Subject={2}",
               e.From, e.To, e.Subject);
        }
        public void Unregister(MailManager mm)
        {
            mm.NewMail -= FaxMsg;
        }
    }
    internal sealed class Pager
    {
        public Pager(MailManager mm)
        {
            mm.NewMail += SendMsgToPager;
        }
        private void SendMsgToPager(Object sender, NewMailEventArgs e)
        {
            Console.WriteLine("发送邮件到寻呼机:");
            Console.WriteLine("   From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject);
        }
        public void Unregister(MailManager mm)
        {
            mm.NewMail -= SendMsgToPager;
        }
    }
复制代码

客户端:

复制代码
  static void Main(string[] args)
        {
            // Construct a MailManager object
            MailManager mm = new MailManager();

            // Construct a Fax object passing it the MailManager object
            Fax fax = new Fax(mm);

            // Construct a Pager object passing it the MailManager object
            Pager pager = new Pager(mm);

            // Simulate an incoming mail message
            mm.SimulateNewMail("Jeffrey", "Kristin", "I Love You!");

            // Force the Fax object to unregister itself with the MailManager
            fax.Unregister(mm);

            // Simulate an incoming mail message
            mm.SimulateNewMail("Jeffrey", "Mom & Dad", "Happy Birthday.");

        }
复制代码

 

posted @   zzhi.wang  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示