一、什么是委托?
在生活中委托就是委托别人来帮你做事,在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,否则就只能得到委托调用的最后一个方法的结果。
总结:委托和类一样,是可以由用户自定义的一种数据类型,使用类时,要先定义一个类,再实例化类的一个对象,委托也是如此,但是要注意,委托的实例仍然叫委托,其意义要具体判断。