C#学习笔记-委托

一、什么是委托? 
    在生活中委托就是委托别人来帮你做事,在C#中呢就是你来委托别人做事,所以你自己就要先定义一个委托:

public delegate void BuyDrumstick();

可以看到委托有访问修饰符,返回类型,它的关键字是delegate
那么,我们应该怎么来使用委托呢?
请看下面的例子


using System;

namespace MyDelegate
{
    //声明一个买鸡腿的委托
    public delegate void BuyDrumstick();

    //任劳任怨的小谢
    class XiaoXie
    {
        //
        public void BuyBuyBuy()
        {
            Console.WriteLine("妈蛋,又叫我去买鸡腿,拿钱来!\n");
        }
    }

    //在寝室不想下床的小李
    class XiaoLi
    {
        //在委托人的类中实例化一个委托
        public BuyDrumstick buyDrumstick;

        public void Hungry()
        {   
            Console.WriteLine("我好饿啊,小谢,你去帮我买个鸡腿吧,^-^\n");
            //这里调用委托,注意,现在这个委托里面还没有连接任何方法!
            buyDrumstick();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //将小李,小谢实例化出来
            XiaoLi xiaoli = new XiaoLi();
            XiaoXie xiaoxie = new XiaoXie();
            //将小谢买鸡腿的这个方法赋值给小李的委托,表示小李已经可以
            //调用这个委托让他去买鸡腿了
            xiaoli.buyDrumstick = new BuyDrumstick(xiaoxie.BuyBuyBuy);
            //现在小李调用带有委托的方法,小谢就去买鸡腿啦
            xiaoli.Hungry();


        }
    }
}



xiaoli.buyDrumstick = new BuyDrumstick(xiaoxie.BuyBuyBuy);
在这句话中将xiaoxie.BuyBuyBuy赋值给了小李的委托xiaoli.buyDrumstick,即委托人想要用什么方法,就把什么方法加进自己的委托实例中。自己再调用自己的这个委托时,委托中的这个方法便会被调用。但要注意,该方法的返回类型和参数要与你所定义的委托保持一致,否则便会出错。

下面来看一个有参数的委托:

using System;

namespace MyDelegate
{
    //声明一个买鸡腿的委托
    public delegate void BuyDrumstick(int num);

    //任劳任怨的小谢
    class XiaoXie
    {
        //方法的参数要与委托保持一致,委托调用此方法时才能正确传参
        public void BuyBuyBuy(int num)
        {
            Console.WriteLine("妈蛋,又叫我去买鸡腿,还要吃{0}个!拿钱来!\n",num);
        }
        public void Eat(int num)
        {
            Console.WriteLine("龟儿子的,买{0}个鸡腿,老子帮你吃几个!\n", num);
        }
    }

    //在寝室不想下床的小李
    class XiaoLi
    {
        //输入要买的数量
        static string input = Console.ReadLine();
        int num = int.Parse(input);
        //在委托人的类中实例化一个委托
        public BuyDrumstick buyDrumstick;

        public void Hungry()
        {   
            Console.WriteLine("我好饿啊,小谢,你去帮我买个{0}鸡腿吧,^-^\n",num);
            //调用时将参数传递进委托
            buyDrumstick(num);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //将小李,小谢实例化出来
            XiaoLi xiaoli = new XiaoLi();
            XiaoXie xiaoxie = new XiaoXie();
            //将小谢买鸡腿的这个方法赋值给小李的委托,表示小李已经可以
            //调用这个委托让他去买鸡腿了
            xiaoli.buyDrumstick = new BuyDrumstick(xiaoxie.BuyBuyBuy);
            //现在小李调用带有委托的方法,小谢就去买鸡腿啦
            xiaoli.Hungry();


        }
    }
}

那么一个委托可不可以链接多个方法呢?
答案是可以的,只要我们使用这样的语法:

xiaoli.buyDrumstick += new BuyDrumstick(xiaoxie.Eat);

这里的+=符号即可给委托再链接一个或多个方法,这句话还可以简写成:

xiaoli.buyDrumstick += xiaoxie.Eat;

这种调用了多个方法的委托就称为多播委托
既然有+=,当然也有-=,当我们想去掉一些方法时就可以用-=

xiaoli.buyDrumstick -= xiaoxie.Eat;

多播委托包含了多个方法的列表,当你在调用多播委托时,这个委托中的方法会依次调用,这样便会增加程序对于其方法调用顺序的依赖性,而当其中的一个方法抛出异常时,整个迭代便会停止。同时,由于多播委托中链接多个方法,因此委托的签名必须返回Void,否则就只能得到委托调用的最后一个方法的结果。

总结:委托和类一样,是可以由用户自定义的一种数据类型,使用类时,要先定义一个类,再实例化类的一个对象,委托也是如此,但是要注意,委托的实例仍然叫委托,其意义要具体判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值