zoukankan      html  css  js  c++  java
  • 事件本质

    事件为什么不能再外面赋值?本质上把事件编译成一个私有的委托变量。

    里面有 add_委托名[事件名] 和remove_委托名[事件名]方法。这两个属性就是利用多播委托的原理。+=: Delegate.Combine  ,-=Delegate.Remove

    示例类:

      /// <summary>
        /// 猫类
        /// </summary>
        class Cat
        {
            private string name;
            private string color;
    
            public Cat(string name, string color)
            {
                this.name = name;
                this.color = color;
            }
    
            /// <summary>
            /// 猫进屋(猫的状态发生改变)(被观察者的状态发生改变)
            /// </summary>
            //public void CatComing(Mouse mouse1,Mouse mouse2,Mouse mouse3)
            public void CatComing()
            {
                Console.WriteLine(color+"的猫"+name+"过来了,喵喵喵 ...");
    
                //mouse1.RunAway();
                //mouse2.RunAway();
                //mouse3.RunAway();
                if(catCome!=null)
                    catCome();
            }
    
            public event Action catCome;//声明一个事件 发布了一个消息
        }
    

    反编译,看下事件的代码:

    1、可以看到生成本质就是2个方法

    2、可以看到是private的委托变量(没有访问修饰符默认)

     

    3、add方法,本质就是调用Delegate.Combine方法,多播委托的原理

    4、remove方法,本质就是调用Delegate.Remove方法,多播委托的原理

  • 相关阅读:
    DockerFile详解--转载
    httpd日志格式
    httpd2.4.6配置文件解释说明
    httpd基于域名虚拟主机配置
    HTTPD三种工作模型
    centos7配置iscsi
    DNS子域授权
    DNS缓存服务器与转发服务器
    函数式编程 pipe之函数柯里化
    typescript安装运行两种方法
  • 原文地址:https://www.cnblogs.com/entclark/p/7967981.html
Copyright © 2011-2022 走看看