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关键字修饰                     
        }
    }
    
    
  • 相关阅读:
    oracle 闪回操作--区别于快照
    easyui 低版本下拉多选框绑定onChange事件样式失真问题
    kvm虚拟机网络配置-网桥
    CentOS7.5使用KVM创建虚拟机
    梦醒时分
    姑娘
    Ventoy+WePE 装机教程
    PG-SSL安全配置
    转载-如何做一份完善的补丁分析
    网络流24题部分题解
  • 原文地址:https://www.cnblogs.com/Extreme/p/3061061.html
Copyright © 2011-2022 走看看