系列一讲述了生活中的委托与事件的一些场景,本篇我们从C#语言的角度来阐述委托的含义。我们设想一个如下场景:中午下课铃声响了,你去学校食堂排队打饭,你女朋友不想走路,让你打包一份饭给她。下面直接上代码:
public class You { //声明一个委托,其实就是个“命令” public delegate void BringLunchEventHandler(); //自己去食堂吃饭的方法 public static void HaveLunch() { Console.WriteLine("去食堂吃饭去了哦!!!"); } //女朋友类 class Girlfriend { public static void TakeLunch() { Console.WriteLine("又要帮女朋友带饭,真懒啊!"); } public static void TaskCandy() { Console.WriteLine("还要帮女朋友带糖,唉,这女人啊,没办法!"); } } public static void Main(string[] args) { //这里就是具体阐述这个命令是干什么的,本例是你“帮女朋友带饭” BringLunchEventHandler lunchDelegate = new BringLunchEventHandler(TakeLunch); lunchDelegate += Girlfriend.TakeCandy;//还要带糖 //这时候委托被附上了具体的方法 lunchDelegate(); Console.ReadKey(); } }
女朋友让你去带饭,她只是相当于下了一个指令,你按照她的意思去做就行了。而她告诉你买什么、买多少、去哪里买,这个相当于指定一个方法的签名,不知道这样大家能否比较好的理解。
public delegate void BringLunchEventHandler();
上面语句即声明了一个委托,委托和方法实际上很相似:相比方法,委托多了一个delegate关键字,没有方法体<这也为什么说委托是一个命令,它什么也不做>。
lunchDelegate += Girlfriend.TakeCandy;//还要带糖
女朋友让你去带饭,也可以让你买糖,也可以是其它什么。C#中,通过+=运算符则可实现委托链-即把多个方法绑定到委托,
当委托被调用时,其绑定的方法均会依次执行。聪明的你应该想到,-=运算符即是取消某个方法的绑定。
附加:委托是一种指向方法的类型,类似于C++中的函数指针,代表一个函数的地址。如int是一种类型,2、3、4等均是此类型的值;同理,委托也是一种类型,TakeLunch()、DoSomething(int count,String message)均是此类型的值,所以委托类型代表的是一个方法。
上面就是我对委托的理解,如有错误之处,欢迎大家指正!下一篇将以同样的方式讲解事件和委托的关系!