委托与事件-闲聊系列(二)

  系列一讲述了生活中的委托与事件的一些场景,本篇我们从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)均是此类型的值,所以委托类型代表的是一个方法。

   上面就是我对委托的理解,如有错误之处,欢迎大家指正!下一篇将以同样的方式讲解事件和委托的关系!

 

      

posted @ 2013-07-17 22:02  ujs_lcp  阅读(383)  评论(0编辑  收藏  举报