参照委托理解事件

namespace EventDemo
{
    public delegate void DeleBark();//声明委托

    class Program
    {
        static void Main(string[] args)//主函数
        {
            Dog d1 = new Dog();
            d1.OnBark += Listen_Bark;
            d1.Bark();//狗叫触发了OnBark“事件”,执行了方法d1_Bark
            d1.OnBark();//欺骗 实际狗没有叫,没有调d1.Bark()方法;

            Dog2 d2 = new Dog2();
            d2.AddBark(Listen_Bark);
            d2.Bark();
            //无法访问到d2的OnBark()安全了!

            Dog3 d3 = new Dog3();
            d3.OnBark+=Listen_Bark;//为事件注册响应方法
            d3.Bark();//内部触发OnBark事件,执行Listen_Bark方法

            Console.ReadKey();
        }
        public static void Listen_Bark()
        {
            Console.WriteLine("狗叫了!");
        }
    }


//1、纯委托类型版“事件”,不安全
    class Dog
    {
        public void Bark()
        {
            if (OnBark!=null)
	        {
                    OnBark();//委托的调用,依赖于Bark(),即监听了Bark()
	        }
        }
        public DeleBark OnBark;//Dog的委托类型成员--“事件”
    }

//2、私有委托类型的“事件”,安全可控

   OnBark定义为private 的,外界不可直接访问和调用。
   增加公共方法AddOnBark和RemoveBark,让外界为这个委托添加或移除方法

    class Dog
    {
        public void Bark()
        {
            if (OnBark != null)
            {
                OnBark();//委托的调用,依赖于Bark(),即监听了Bark()
            }
        }
        private DelBark OnBark;//Dog的委托类型的私有成员--“事件”

        //给“事件”注册方法
        public void AddBark(DeleBark dele)
        {
            OnBark += dele;
        }
	//给“事件”注销方法
	public void RemoveBark(DeleBark dele)
        {
            OnBark -= dele;
        }
    }

//3、真实的事件:public的事件相当于:一个私有的委托成员 加上公开的Add和Remove两个方法
   
   // 将事件成员被设置为public的event修饰的成员。
   // 封装Add方法和Remove方法,外界可通过“+=”和“-=”为期注册和注销事件响应方法。
   // 由于是event修饰的,只允许内部调用,外界不能调用了。

    class Dog
    {
        public void Bark()
        {
            if (OnBark != null)
            {
                OnBark();//事件的触发,依赖于Bark(),即监听了Bark()
            }
        }
        public event DelBark OnBark;//定义事件,用原来语言上再加event关键字修饰                     
    }
}

posted @ 2013-05-05 15:41  kinglong1984  阅读(170)  评论(0编辑  收藏  举报