zoukankan      html  css  js  c++  java
  • 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:委托的本质是一个类)

  • 相关阅读:
    Java实现 LeetCode 657 机器人能否返回原点(暴力大法)
    PHP imagearc
    PHP imageantialias
    PHP imagealphablending
    PHP imageaffinematrixget
    PHP imageaffinematrixconcat
    空单元 | empty-cells (Miscellaneous Level 2)
    矩阵 | matrix() (Transforms)
    相邻兄弟选择器 | Adjacent sibling selectors (Selectors)
    相抵路径 | offset-path (Motion Path)
  • 原文地址:https://www.cnblogs.com/MorganMa/p/12981874.html
Copyright © 2011-2022 走看看