Event 事件

Event 事件

事件的命名准则使用 PascalCasing 命名方式

  • 事件名 EventName
  • 委托名 EventNameEventHandler , 委托使用 void 作为返回值
  • 在引发事件的类中提供一个受保护的方法,以 OnEventName 进行命名。在该方法中引发该事件。

Delegate 委托

委托是静态类型,只能用类名调用


    class Program
    {
        class PubEventArgs : EventArgs
        {
            private readonly string m_magazineName;
            private readonly DateTime m_PubDate;
            public PubEventArgs(string magazineName, DateTime PubDate)
            {
                m_magazineName = magazineName;
                m_PubDate = PubDate;
            }
            public string magazineName
            {
                get { return m_magazineName; } 
            }
            public DateTime PubDate
            {
                get { return m_PubDate; }
            }
        }

        class Publisher
        {
            //1   在事件发行者中定义一个事件
            //1.1 声明与事件关联的委托类型
            public delegate void PubMagazineEventHandler(object sender, PubEventArgs e);

            //1.2 根据声明的委托类型,声明相应的事件
            public event PubMagazineEventHandler PubMagazine;

            //2   在事件发行者中触发事件
            protected virtual void OnPubMagazine(PubEventArgs e)
            {
                PubMagazineEventHandler handler = PubMagazine;
                if (handler != null)
                {
                    handler(this, e);
                }
            }

            public void issueMagazine(string magazineName, DateTime pubDate) //触发事件的方法
            {
                Console.WriteLine("发行" + magazineName);
                OnPubMagazine(new PubEventArgs(magazineName, pubDate));
            }
        }

        class Subscriber
        {
            //3   在事件订阅者中定义事件处理程序
            public void Receive(object sender, PubEventArgs e)
            {
                Console.WriteLine("日期:" + e.PubDate);
                Console.WriteLine("名称:" + e.magazineName);
            }
        }

        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber();
            Subscriber sub2 = new Subscriber();

            //4   向事件发行者订阅一个事件
            pub.PubMagazine += new Publisher.PubMagazineEventHandler(sub1.Receive);
            pub.PubMagazine += new Publisher.PubMagazineEventHandler(sub2.Receive);
            pub.issueMagazine("2012", Convert.ToDateTime("2011-12-29"));  //触发事件
            pub.PubMagazine -= new Publisher.PubMagazineEventHandler(sub2.Receive); //取消订阅事件
            pub.issueMagazine("2012", Convert.ToDateTime("2011-12-30")); //触发事件
            Console.ReadLine();
        }
    }


    class Program
    {
        class NewEventArgs : EventArgs
        {

        }
        
        class Publisher
        {
            public delegate void EventNameEventHandler(object sender, NewEventArgs e);
            public event EventNameEventHandler EventName;
            protected void OnEventName(NewEventArgs e)
            {
                EventNameEventHandler handler = EventName;
                if (handler != null)
                {
                    handler(this, e);
                }
            }
            public void StartEvent()
            {
                OnEventName(new NewEventArgs());
            }
        }

        class Subscriber
        {
            public void EventReceive(object sender, NewEventArgs e)
            {

            }
        }    

        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub = new Subscriber();
            pub.EventName += new Publisher.EventNameEventHandler(sub.EventReceive);
            pub.StartEvent();
            pub.EventName -= new Publisher.EventNameEventHandler(sub.EventReceive);
            pub.StartEvent();
        }    
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值