3分钟看懂C#委托

委托是c#语言的一大亮点,最大的作用是让一个方法可以作为另一个方法的参数
下面是一个简单的示例

    internal class Program
    {
        //使用delegate定义委托类型
        private delegate void MyDelegate(int a, int b);
        private static void Main()
        {
            //声明变量,实例化委托,传递的实例方法,也可以是静态类型
            var d = new MyDelegate(new Program().Add);
            //委托作为参数传给另一个方法
            MyMethod(d);
            Console.Read();
        }
        //方法定义要与委托定义相同,返回类型void,int类型参数
        private void Add(int a, int b)
        {
            int sum = a + b;
            Console.WriteLine(sum);
        }
        //方法参数是委托类型
        private static void MyMethod(MyDelegate myDelegate)
        {
            //方法中调用委托
            myDelegate(1, 2);
        }
    }

再来看看委托链,多个委托链接在一起就是委托链,使用 “+”链接委托,“-”移除委托

    internal class Program
    {
        public delegate void MyDelegate();

        private static void Main()
        {
            var d1 = new MyDelegate(Program.Method1);
            var d2 = new MyDelegate(new Program().Method2);
            //定义一个委托对象
            MyDelegate d = null;
            //“+”链接委托,“-”移除委托,如d -= d2;
            d += d1;
            d += d2;
            //调用委托链
            d();
            Console.Read();
        }

        private static void Method1()
        {
            Console.WriteLine("静态方法");
        }

        private void Method2()
        {
            Console.WriteLine("实例方法");
        }
    }

这时候再看官方文档 "如何合并委托(多播委托)(C# 编程指南)"就很容易理解了

    // 定义委托
    internal delegate void CustomDel(string s);

    internal class TestClass
    {
        // 定义两个方法,方法定义要与委托定义相同,返回类型void,string类型参数
        private static void Hello(string s)
        {
            Console.WriteLine($"  Hello, {s}!");
        }

        private static void Goodbye(string s)
        {
            Console.WriteLine($"  Goodbye, {s}!");
        }

        private static void Main()
        {
            // 定义委托实例
            CustomDel hiDel, byeDel, multiDel, multiMinusHiDel;
            // 如果想要省略定义委托,可以使用Action<string>替代
            // 如 Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;

            // 引用方法Hello.
            hiDel = Hello;
            // 引用方法 Goodbye.
            byeDel = Goodbye;

            //“+” 链接两个委托形成委托链(多播委托)
            multiDel = hiDel + byeDel;
            //“-” 从委托链中移除委托
            multiMinusHiDel = multiDel - hiDel;

            Console.WriteLine("Invoking delegate hiDel:");
            hiDel("A");
            Console.WriteLine("Invoking delegate byeDel:");
            byeDel("B");
            Console.WriteLine("Invoking delegate multiDel:");
            multiDel("C");
            Console.WriteLine("Invoking delegate multiMinusHiDel:");
            multiMinusHiDel("D");
        }
    }

    /* 输出:
    Invoking delegate hiDel:
      Hello, A!
    Invoking delegate byeDel:
      Goodbye, B!
    Invoking delegate multiDel:
      Hello, C!
      Goodbye, C!
    Invoking delegate multiMinusHiDel:
      Goodbye, D!
    */

(PS:委托的本质是一个类)

posted @ 2020-05-28 17:36  callcall  阅读(652)  评论(0编辑  收藏  举报