zoukankan      html  css  js  c++  java
  • 参照委托理解事件

    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关键字修饰                     
        }
    }
    
    
  • 相关阅读:
    C++的常量折叠(一)
    如何写面向互联网公司的求职简历
    所有的程序员都是自学成才
    [一个经典的多线程同步问题]解决方案一:关键段CS
    [一个经典的多线程同步问题]问题引入
    多线程笔记--原子操作Interlocked系列函数
    【分治法】归并分类
    内存字节对齐一网打尽,再也不纠结
    在C语言中基本数据类型所占的字节数
    多线程笔记--先了解工具
  • 原文地址:https://www.cnblogs.com/Extreme/p/3061061.html
Copyright © 2011-2022 走看看