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,否则就只能得到委托调用的最后一个方法的结果。
总结:委托和类一样,是可以由用户自定义的一种数据类型,使用类时,要先定义一个类,再实例化类的一个对象,委托也是如此,但是要注意,委托的实例仍然叫委托,其意义要具体判断。
相关文章推荐
- CLR Via C#系列学习笔记之委托
- C#学习笔记 委托和事件
- [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
- C#学习笔记一:委托、匿名函数、Lambda 表达式
- C#事件 委托 学习笔记
- C#学习笔记五---委托
- C#学习笔记8——C# 中的委托和事件
- 学习笔记之---C#中的委托与事件
- [C#]C#学习笔记-委托,事件
- C#学习笔记之一:委托
- C#教程第8讲委托2(学习笔记)
- C#与.NET4 高级程序设计-----委托、事件 学习笔记
- 学习笔记之---C#中的委托与事件
- c# 委托的学习笔记(附代码)
- c#学习笔记(六)委托
- 学习笔记:c#函数名可以直接赋值给委托
- C#学习笔记之三:C#接口与事件委托
- C#学习笔记——委托
- C#“委托”学习笔记
- C#学习笔记-委托,event