您的位置:首页 > 编程语言 > C#

C#学习笔记-委托

2017-02-12 18:17 211 查看
一、什么是委托?
在生活中委托就是委托别人来帮你做事,在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,否则就只能得到委托调用的最后一个方法的结果。

总结:委托和类一样,是可以由用户自定义的一种数据类型,使用类时,要先定义一个类,再实例化类的一个对象,委托也是如此,但是要注意,委托的实例仍然叫委托,其意义要具体判断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# delegate