c#:浅析委托(Delegate)

c#:浅析委托(Delegate)


其实我觉得委托这块还是挺难理解的,不过现在差不多明白了一些皮毛,我的理解是:委托不想做的事就命令,让其他方法(与委托参数列表以及返回值类型相同的方法)去做,做好了委托直接调用就行,其实受累的还是委托命令的方法,白干一场没得到啥好处,功劳还被委托拿走了。那么就让我们一起去看看吧!

一、什么是委托

​ **专业术语:**委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。

​ 委托类型表示对具有特定参数列表和返回类型的方法的引用。 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体

委托是引用类型,可以把它看作是用来存方法的一种类型。比如说类型string用来定义存取字符串的变量,那么委托类型delegate就可以用来定义存方法的变量委托和类一样,是一种用户自定义类型。但类表示的是数据和方法的集合,而委托表示的是一个或多个方法的集合。你可以把delegate看作一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型
在这里插入图片描述
**注:**所有的委托都派生自 System.Delegate

二、声明委托

声明语法:
在这里插入图片描述

delegate <返回值类型> <委托名称> <参数列表>;
//委托使用delegate关键字声明

例如:

 delegate void Idext(int x,int c);
 delegate string Idextion(double a);

三、实例化委托

​ **注:**一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有数值参数,而是方法名称,并且这个方法的签名返回值类型要和委托的一样。

例如:

            Idext id1 = new Idext(p.Addnum1);

四、委托示例


    class DelegateApp//实例化的类
    {
        public delegate int Idext(int n);//声明一个委托叫Idext
        int num = 10;//定义字段
        //方法的返回值类型、参数列表要于委托相一致,可以说是方法签名一致
        public  int Addnum1(int p)
        {
            num += p;
            return num;
        }
        public  int Addnum2(int q)
        {
            num *= q;
            return num;
        }
       public int getnum()
        {
            return num;
        }
    }
//外部调用
  class Program
    {
        static void Main(string[] args)
        {
        	//实例化对象
            DelegateApp d = new DelegateApp();
            //创建委托实例
            Idext id1 = new Idext(d.Addnum1);
            Idext id2 = new Idext(d.Addnum2);
            //使用委托对象调用委托并传参
            id1(20);
            Console.WriteLine("值为{0}", d.getnum());
            id2(10);
            Console.WriteLine("值为{0}", d.getnum());
            Console.ReadLine();
        }
    }

输出结果:
在这里插入图片描述

四、委托的多播

委托可以包含多个方法,这种委托称为多播委托,或组播委托。如果调用多播委托,就可以按顺序连续调用多个方法为此委托的签名必须返回void,否则就只能得到委调用的最后一个方法的结果,也就是说想要调用连续的几个方法,那么他们的方法以及委托的返回值为void,否则为其他的,什么int、string就会得到最后一个方法返回的数数值。

​ 多播委托可以使用运算符“+”和“+=”添加方法,也可以使用“-”和“-=”从委托中删除方法调用。

**委托多播实例:**小明叫小张买完车票后,就这又让它带张电影票

 //小张类
    class DelegateApp
    {
        public void BuyTicket()
        {
            //其实买车票的悲剧人物是小张
            Console.WriteLine("NMD,每次都让人买火车票,鸡人呢!");
        }
        public  void BuyMovieTicket()
        {
            Console.WriteLine("卧槽,自己泡妞还要让我带电影票");
        }
    }
   //小明类
    class Program
    {
        public delegate void Idext();//声明一个委托,其实就是命令
        static void Main(string[] args)
        {
            DelegateApp d = new DelegateApp();
            //创建委托实例
            //这里就是具体阐述这个命令是干什么的,本例是d.BuyTicket“小张买火车票”
            Idext id1 = new Idext(d.BuyTicket);
            id1 += d.BuyMovieTicket;
            //这时候委托被赋上的具体的方法
            id1();
            Console.ReadLine();
        }
    }

运行结果:

在这里插入图片描述
——————————————————————

以上均为自己在一天的忙碌中学习并总结到的一些入门小知识,所以说今天收获颇多。也希望对你们能够有一定的帮助。如果文章有什么不完善的地方,或者数对大家造成了误导,还希望大家能够指出我i的错误,并且纠正我的错误,我期待和大家的进步,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值