事件

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");
        }
    }

    

原文地址:https://www.cnblogs.com/xiao9426926/p/6088880.html