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

本文介绍了C#中的委托(Delegate)概念,它是一种指向方法的引用对象,可引用静态或实例方法。文章通过示例展示了如何创建及使用委托,包括单播和多播,并探讨了委托在方法调用中的作用和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 委托(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));
            }
        }

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


总结:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值