C#基础-3:委托(Delegate)

  • 委托(delegate)简单来看就是一种指向方法的引用对象。其实,delegate就是一个类,其持有所指向的方法的地址。
  • 委托可以引用一个方法,也可以应用多个方法,当引用多个方法的时候,称之为多路广播(多播)。
  • 委托既可以引用静态方法,也可以应用实例方法。

下面先看委托对静态方法的引用:

        //定义一个委托,使用关键字delegate,其后面的int是委托引用的方法的返回值;
        //NumberChanger是委托名,括号内是委托引用的方法的参数类型。
        delegate int NumberChanger(int num);
        class NumChanger
        {
            static int num = 10;

            //静态方法AddNum()
            public static int AddNum(int n)
            {
                num += n;
                return num;
            }

            //静态方法MultiNum()
            public static int MultiNum(int n)
            {
                num *= n;
                return num;
            }

            public static int GetNum()
            {
                return num;
            }

            public static void Main()
            {   
                //实例化委托nc,并引用静态方法AddNum()
                NumberChanger nc = new NumberChanger(AddNum);
                //实例化委托nc2,并引用静态方法NultiNum()
                NumberChanger nc2 = new NumberChanger(MultiNum);

                //执行委托nc引用的方法
                nc(5);
                Console.WriteLine("num is {0}", GetNum());
                //执行委托nc2引用的方法
                nc2(10);
                Console.WriteLine("num is {0}", GetNum());
            }
        }

上面这两个委托都只引用一个方法。
代码nc(5)实际就是指向静态方法AddNum(5);
代码nc2(10)实际就是指向静态方法MultiNum(10);
执行结果如下:
这里写图片描述


当我们使用一个委托去引用多个方法时(多播),代码修改如下:

        //定义一个委托,使用关键字delegate,其后面的int是委托引用的方法的返回值;
        //NumberChanger是委托名,括号内是委托引用的方法的参数类型。
        delegate int NumberChanger(int num);
        class NumChanger
        {
            static int num = 10;

            //静态方法AddNum()
            public static int AddNum(int n)
            {
                Console.WriteLine("执行了AddNum方法!");
                num += n;
                return num;
            }

            //静态方法MultiNum()
            public static int MultiNum(int n)
            {
                Console.WriteLine("执行了MultiNum方法!");
                num *= n;
                return num;
            }

            public static int GetNum()
            {
                return num;
            }

            public static void Main()
            {
                //实例化委托nc,并引用静态方法AddNum()
                NumberChanger nc = new NumberChanger(AddNum);
                nc += MultiNum;
                //执行委托nc引用的方法
                nc(5);
                Console.WriteLine("num is {0}", GetNum());
            }
        }

上面Main方法中的代码还可以采用下面这样,实际是一样的:

                NumberChanger nc;
                NumberChanger nc1 = new NumberChanger(AddNum);
                NumberChanger nc2 = new NumberChanger(MultiNum);
                nc = nc1;
                nc += nc2;

                nc(5);
                Console.WriteLine("num is {0}", GetNum());

代码运行结果:
这里写图片描述


接下来是委托对实例方法的引用:

        //定义一个委托
        delegate string NumToString(int num);
        class NumToStr {
            //定义实例方法getString()
            public string getString(int num) {
                return Convert.ToString("这是字符串:"+num);            
            }
            //定义实例方法addStr()
            public string addStr(int num) {
                return "这是拼接后的字符串"+num+"-后缀-";
            }
            //Main方法
            public static void Main(String[] args)
            {
                //将实例方法getString()引用到委托n1
                NumToString n1 = new NumToString(new NumToStr().getString);
                Console.WriteLine(n1(55));
                //将实例方法addStr()引用到委托n2
                NumToString n2 = new NumToString(new NumToStr().addStr);
                Console.WriteLine(n2(110));
            }
        }

代码执行结果如下:
这里写图片描述
对于实例方法的多播跟静态方法没有什么区别,同样是需要对实例方法所属的类进行实例化后传入到委托的参数当中。


总结:

  • 简单理解委托就是用来执行方法的一个东西。
  • 委托是将方法的引用封装在委托对象内,然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
  • 委托还可以将一些方法集成到一块执行。

以上是我最近一些理解,后面有更深的体会后会进行补充修改。

猜你喜欢

转载自blog.csdn.net/u011314731/article/details/51965469