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在定义时必须也为无参数方法。
小结:委托用一句话概括,就像上面说的:委托是一个命令,把事情交代给别人去做;在程序中体现就是委托存储了各个方法的地址,调用地址从而实现调用方法的功能。
- C#——委托
- C#——委托
- C#-—体验委托
- C#—委托
- c#—委托和事件
- C#—委托与事件
- C#- 委托
- C#- 委托
- c#-委托
- C#---委托
- C#委托
- C#--委托
- Objective-C——委托模式
- 【C#】——委托与事件
- C#——委托和事件
- (C#)委托—可扩展
- C#中的委托
- C#中的委托
- linux shell数组赋值方法(常用)
- [MySQL FAQ]系列 — 线上环境到底要不要开启query cache
- 矩阵运算库Armadillo,Eigen,MATCOM在windows+vs2010环境下的安装和测评(1)
- OpenStack Mnaila 2015-09-10 IRC会议内容
- java.lang.String中的trim()方法的详细说明
- C#—委托
- wstring转string和string转wstring
- android 使用zxing生成中间嵌套logo的二维码
- namespace的用法
- 对于父类引用指向子类对象的一些看法
- 推荐系统中的常用算法
- 建立 Android 游戏项目的必备 XxxManifest.xml 配置
- 一个关于计算整数bit位上有多少个1的算法
- 文章标题