zoukankan      html  css  js  c++  java
  • 事件

    1. 多播委托

        多播委托就是一个方法列表:+=在列表尾巴上加方法;-=就是从尾巴开始匹配,

        只移除第一个完全吻合额方法,如果没有吻合,不报错。

    class MultiDelegateShow 
        {
            public void MultiDelegateExample()
            {
                //多播委托就是一个方法列表:+=在列表尾巴上加方法;-=就是从尾巴开始匹配,
                //只移除第一个完全吻合额方法,如果没有吻合,不报错。
    
                OtherClass otherclass = new OtherClass();
    
                Console.WriteLine("*****************************+=添加方法列表********************************");
                Action del1 = new Action(this.SameClassMethod); //加入1. 同类中的方法
                del1 += new OtherClass().OtherClassMethod; //加入 2. 不同类的实例方法
                del1 += OtherClass.StaticMethod;//加入3.静态方法
                del1 += () => Console.WriteLine("LambdaMethod is be calling"); //加入4.lambda表达式
                del1 += otherclass.OtherClassMethod;//加入5. 注意和2的区别
                del1.Invoke();  //程序会按照1,2,3,4调用方法
    
                Console.WriteLine("*****************************-=删除方法列表********************************");
                del1 -= this.SameClassMethod; //从尾巴开始查找(4,3,2,1),匹配到删除
                del1 -= OtherClass.StaticMethod; // 静态方法删除
                del1-= new OtherClass().OtherClassMethod;//这里删除不了,因为是不同实例的方法
                del1 -= () => Console.WriteLine("LambdaMethod is be calling");//Lambda方法是无法移除的
                del1 -= otherclass.OtherClassMethod;//这是同一个实例方法,被移除
                del1.Invoke();
    
                Console.WriteLine("***************************带有返回值的多播委托******************************");
                Func<string> del2 = new Func<string>(otherclass.WithReturnMethod);
                del2 += () => "1";
                del2 += () => "2";
                del2 += () => "3";
                del2 += () => "4";
                Console.WriteLine(del2.Invoke());      //带返回值的多播委托,只能获得最后一个方法的返回值
    
                Console.WriteLine("*****************************多播委托的异步调用********************************");
                //del1.BeginInvoke(null, null); 多播委托不能直接异步调用
                foreach (Action item in del1.GetInvocationList()) //这里相当于为每一个委托开一个线程
                {
                    item.BeginInvoke(null, null);
                }
            }
    
            private void SameClassMethod()   
            {
                Console.WriteLine(" SameClassMethod is be calling");
            }
        }
        
        class OtherClass
        {
            public void OtherClassMethod()
            {
                Console.WriteLine("OtherClassMethod is be calling");
            }
    
            public static void StaticMethod()
            {
                Console.WriteLine("StaticMethod is be calling");
            }
    
            public string WithReturnMethod()
            {
                return string.Format("This is a method with a string return");
            }
        }

    2. 委托的意义:解耦

                            异步多线程

                            多播委托

    3. 事件

       事件就是委托的实例,加了一个Event关键字

       委托是一种类型,事件是委托的实例

       加Event关键字后,控制了权限,不让外部调用或直接赋值   

    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("*****************************EventShow********************************");
                EventShow eventshow = new EventShow() ;
    
                //Action catdelegate = Dog.Run; 委托可以直接赋值
                //catdelegate.Invoke(); 委托可以直接调用
                //catdelegate = null; 委托可以赋值null
                //eventshow.catEventhandle = Dog.Run;  事件不可以直接赋值
                //eventshow .catEventhandle.Invoke();  事件不让外部直接调用
                //事件控制了权限,事件只能出现在+=,-=的左边
                eventshow.catEventhandle += Dog.Run;
                eventshow.catEventhandle += Baby.Cry;
                eventshow.catEventhandle += Father.Turn;
                eventshow.catEventhandle += Mother.Hug;
                eventshow.CatMiao();
                Console.ReadKey();
            }
        class EventShow
        { 
            public event Action catEventhandle=null;
            public void CatMiao()
            {
                Console.WriteLine("cat Miao");
                if(catEventhandle!=null)
                {
                    catEventhandle.Invoke();
                }
            }
        }
        class Dog
        {
            public static void Run()
            {
                Console.WriteLine("Dog Run");
            }
        }

        

  • 相关阅读:
    elementui问题汇总
    微信小程序实现微信授权登录
    微信小程序数据存储
    小程序使用第三方服务,需要中转到一个h5页面,返回到指定页面
    小程序开发,通过左上角返回到指定页面
    万恶之源-基本数据类型(list,tuple)
    基础中的基础
    mybatis_plus实现自动填充和逻辑删除
    本地端口占用解决方案
    maven定义版本以来报红解决方案
  • 原文地址:https://www.cnblogs.com/xiao9426926/p/6088880.html
Copyright © 2011-2022 走看看