C# 委托

1. 委托的声明

        /// <summary>
        /// 1 委托在IL就是一个类
        /// 2 继承自System.MulticastDelegate 特殊类-不能被继承
        /// </summary>
        public delegate void NoReturnNoPara();
        public delegate void NoReturnWithPara(int x, int y);//1 声明委托
        public delegate int WithReturnNoPara();
        public delegate MyDelegate WithReturnWithPara(out int x, ref int y);

2.委托的使用

    public class OtherClass
    {
        public void DoNothing()
        {
            Console.WriteLine("This is DoNothing");
        }
        public static void DoNothingStatic()
        {
            Console.WriteLine("This is DoNothingStatic");
        }
    }

    public class MyDelegate //: System.MulticastDelegate
    {

        public int Get()
        {
            return 1;
        }
        private MyDelegate ParaReturn(out int x, ref int y)
        {
            throw new Exception();
        }


        private void DoNothing()
        {
            Console.WriteLine("This is DoNothing");
        }
        private static void DoNothingStatic()
        {
            Console.WriteLine("This is DoNothingStatic");
        }
    }
                NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
                NoReturnNoPara method1 =this.DoNothing;//简写
                //2 委托的实例化  要求传递一个参数类型 返回值都跟委托一致的方法,
                method.Invoke();//3委托实例的调用  参数和委托约束的一致
                this.DoNothing();//效果跟直接调用方法一致
                method();//可以省略.Invoke
                method.BeginInvoke(null, null);//启动一个线程完成计算
                //method.EndInvoke(null);

                //委托就是一个类 为什么要用委托? 这个类的实例可以放入一个方法,实例Inovke时,就调用方法
                //说起来还是在执行方法,为啥要做成三个步骤? 唯一的差别,就是把方法放入了一个对象/变量

3. 委托的应用

例子:

        /// <summary>
        /// 中国人---晚上好
        /// 美国人---good evening
        /// ...
        /// 
        /// 假如要增加一个国家的人Malaysia,就得修改方法,增加一个分支
        /// 任意分支变化 都得修改方法
        /// 经常改动  很不稳定  难以维护
        /// 
        /// 增加公共逻辑方便
        /// 
        /// 为不同的人,进行不同的问候
        /// 传递个变量---判断一下---执行对应的逻辑
        /// 能不能直接点,直接传递逻辑呗
        /// 逻辑就是方法---委托
        /// </summary>
        /// <param name="name"></param>
        public void SayHi(string name, PeopleType peopleType)
        {
            Console.WriteLine("prepare SayHi..");
            switch (peopleType)
            {
                case PeopleType.Chinese:
                    Console.WriteLine($"{name},晚上好~");
                    break;
                case PeopleType.American:
                    Console.WriteLine($"{name},good evening~");
                    break;

                case PeopleType.Malaysia:
                    Console.WriteLine($"{name},*^%*^%^&%^%~");
                    break;

                default://遇到不认识的枚举,说明调用有问题,那就不要隐藏,直接异常
                    throw new Exception("wrong peopleType");
            }
        }

改写

        //1 加参数判断---执行分支逻辑
        //2 加方法满足不同的场景   如果方法特别复杂,就推荐这个

        /// <summary>
        /// 既增加公共逻辑方便,又逻辑分离维护简单  鱼肉熊掌怎么兼得?
        /// 自上往下---逻辑解耦,方便维护升级
        /// 
        /// 自下往上---代码重用,去掉重复代码
        /// </summary>
        public void SayHi(string name, SayHiDelegate method)
        {
            //Action<string,int>
            //Func<string>

            Console.WriteLine("prepare SayHi..");

            method.Invoke(name);
        }
 
       public delegate void SayHiDelegate(string name);


        /// <summary>
        /// 增加分支,就增加方法--不影响别的方法
        /// 修改某个方法--不影响别的方法
        /// 
        /// 增加公共逻辑---多个方法有很多重复代码
        /// 
        /// 既有相同的东西,也有不同的东西
        /// 相同的东西用一个方法实现,不同的各自去写,然后通过委托组合
        /// </summary>
        /// <param name="name"></param>
        public void SayHiChinese(string name)
        {
            //Console.WriteLine("prepare SayHi..");

            Console.WriteLine($"{name},晚上好~");
        }

        public void SayHiAmerican(string name)
        {
            //Console.WriteLine("prepare SayHi..");

            Console.WriteLine($"{name},good evening~");
        }

        public void SayHiMalaysia(string name)
        {
            //Console.WriteLine("prepare SayHi..");

            Console.WriteLine($"{name},*^%*^%^&%^%~~");
        }
--------------------调用---------------------------------


                        SayHiDelegate method = SayHiChinese;
                        student.SayHi("大脸猫", method);


                        SayHiDelegate method1 =SayHiAmerican;
                        student.SayHi("PHS", method1);


                        SayHiDelegate method2 = SayHiMalaysi;
                        student.SayHi("icefoxz", method2);

 

posted @ 2020-02-20 11:52  明志德道  阅读(233)  评论(0编辑  收藏  举报