C#—委托

来源:互联网 发布:上海淘宝运营培训 编辑:程序博客网 时间:2024/06/05 21:00

什么是委托?

  委托属于引用类型中的类类型,在委托中,可以将方法动态的作为另一个方法的参数,从而实现用方法来调用方法,可以减少程序中选择(if)、分支(switch)语句的使用,也能使程序获得良好的可扩展性。

  通俗一些讲,委托是一个类,其实例化出的对象可以用来调用其他的方法。


委托的声明方式:

  delegate为声明委托的关键字;

  [访问修饰符] delegate 返回值类型 委托名(形参);

  举例:public delegate viod A();//声明命名为A的委托类型

        A a=new A(); //将A类实例化出命名为a的委托实例

  联系现实生活,委托可以看为是一个命令,把事情交代给别人,让别人去做,自己只负责交代就行。在我们的程序里面,委托是存储了各个方法的地址,去调用该地址,从而实现调用方法的功能。


  写一个小例子:我让小明去打水:


//小明类    class XiaoMing    {        //实际打水的是小明,所以小明拥有打水的方法,定义为静态方法,直接由类名调用        public static void GetWater()        {            Console.WriteLine("哥,把水给您打来了!");        }    }    //我    class Me    {        //声明一个委托,“为我服务”的命令        public delegate void ServerForMe();//主方法        public static void Main(String[] args)        {            //实例化出“打水”的命令,并将小明的方法名传进来(方法名中保存的就是方法的地址)            ServerForMe WaterComing = new ServerForMe(XiaoMing.GetWater);        WaterComing();    //等待键盘输入,如果没有此句,运行完毕后DOS窗口会闪退,运行时按Ctrl+F5也行            Console.ReadKey();        }    } 


  运行结果为:哥,把水给您打来了!

  假如,我让小明去打水的时候,发现自己饿了,于是让小明把饭也捎回来,那么:


//小明类    class XiaoMing    {        //实际打水的是小明,所以小明拥有打水的方法,定义为静态方法,直接由类名调用        public static void GetWater()        {            Console.WriteLine("哥,把水给您打来了!");        }public static void GetFood(){    Console.WriteLine("哥,把饭给您打来了!");}    }    //我    class Me    {        //声明一个委托,“为我服务”的命令        public delegate void ServerForMe();//主方法        public static void Main(String[] args)        {            //实例化出“打水”的命令,并将小明的方法名传进来(方法名中保存的就是方法的地址)            ServerForMe WaterComing = new ServerForMe(XiaoMing.GetWater);        //实例化出“打饭”的命令    ServerForMe FoodComing = new ServerForMe(XiaoMing.GetFood);    //为小明添加打饭的任务    WaterComing +=FoodComing;    //这时候委托中包含打水和打饭两项任务    WaterComing();    //等待键盘输入,如果没有此句,运行完毕后DOS窗口会闪退,运行时按Ctrl+F5也行            Console.ReadKey();        }    } 


  可以发现,第一次赋值号“=”是给委托设置任务的语法;第二次用“+=”,是给委托增加绑定的任务的语法。假如刚开始就用“+=”号会出现“使用了未赋值的局部变量”的出错提示。相同的,如果给委托减少绑定任务的语法是什么呢?对,就是“-=”。这样可以随时增加、减少执行任务,就是可扩展性的体现。


  需要注意:委托和被委托方法在定义时要具有相同的参数,这是必须的,因为小明打饭、打水方法没有参数,所以我的委托ServerMe在定义时必须也为无参数方法。


  小结:委托用一句话概括,就像上面说的:委托是一个命令,把事情交代给别人去做;在程序中体现就是委托存储了各个方法的地址,调用地址从而实现调用方法的功能。


1

3 0