说到委托,大多数的编程人员可能都听说过,甚至用过,可是能把委托说明白,别人也能听明白的就不多了吧。这篇文章就由浅入深的介绍一下,委托到底是什么。
委托是面向对象的标志,面向对象来源于现实世界,当然委托在现实世界中也是有原型的,比如:“小明,帮我买包烟”。这就是现实中的委托:‘我’委托小明‘买饭’。
面向对象是如何实现的呢?先来看一下委托的定义:
public delegate void BuyFoodEventHandler();
public代表委托是公有的,可访问的;delegate是委托的关键字;void是委托的返回值类型;BuyFoodEventHandler是委托的名称,其中EventHandler微软公司规定的命名标准,方法名称加上后缀就是委托名称。
好了,这就是一个委托。我们把它和方法比较一下,它和方法的不同点就是:1委托需要关键字标识;2委托名称需要以EventHandler结尾;3委托没有方法体;4委托的返回值类型和委托方法的返回值类型一致。
接下来,我们使用代码来实现委托小明买烟这个过程。
<span style="font-size:18px;">public class Program { //定义委托 public delegate void BuyEventhandler(); public static void Main(string[] args) { //声明委托,委托的方法 BuyEventhandler myDelegate = new BuyEventhandler(XiaoMing.BuyCigarette); myDelegate += XiaoHong.BuyWater; //委托方法的实现 myDelegate(); Console.ReadKey(); } } public class XiaoMing { //买烟的方法 public static void BuyCigarette() { Console.WriteLine("吸烟有害健康!"); } } </span>BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyCigarate);这句话是委托的声明;括号内是委托的方法,这个方法一定要写,因为它属于委托的构造函数体,构造函数不能为空;
如果再让小红买一瓶水,如何实现呢?委托链可以解决这个问题,下面是委托链的介绍:
<span style="font-size:18px;">public class Program { //定义委托 public delegate void BuyEventhandler(); public static void Main(string[] args) { //声明委托,委托的方法 BuyEventhandler myDelegate = newBuyEventhandler(XiaoMing.BuyCigarette); myDelegate += XiaoHong.BuyWater; //委托方法的实现 myDelegate(); Console.ReadKey(); } } public classXiaoMing { //买烟的方法 public static void BuyCigarette() { Console.WriteLine("吸烟有害健康!"); } } public classXiaoHong { //买水的方法 public static void BuyWater() { Console.WriteLine("买个水都让我去,真懒!"); } }</span>
其实,我们只是在程序中加了 myDelegate += XiaoHong.BuyWater;
;这样就构成了委托链,实现了一个委托可以实现多个方法。
这里总结一下,委托其实就是方法的指针,可以把方法当做参数来使用,这样可以大大的增加程序的灵活性和可扩展性。