委托的定义:委托是持有一个或多个方法的对象。
delegate void MyDel(int value);//声明委托类型
MyDel del;//声明委托变量
委托的实质:委托的实质其实也是类,同样继承System.Object,这也是委托无论在类内还是类外都能被定义的原因。
委托的作用:委托是一种类型安全的函数回调机制,它不仅能够调用实例方法,也能调用静态方法,并且具备执行多个方法的能力。
委托的本质:委托的本质就是将可执行的代码从一个方法传递到另一个方法;从程序的角度上来看,你可以把委托看成是用来执行方法的一个“指针”。
委托存在的意义:一般情况下你不会想要“执行”一个对象,但委托会执行它所“持有”的方法。
1、使用委托可以增强可扩展性。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用 If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
不使用委托的情况
class Program{//委托的意义之一:使程序具有更好的可扩展性//将方法当做参数一样使用,避免了对方法的判断,极大强化的程序的可扩展性static void Main(string[] args){GreetPeople("jakecheng", Language.English);GreetPeople("成龙", Language.Chinese);Console.ReadLine();}public enum Language { English,Chinese}public static void GreetPeople(string name,Language lang){switch (lang){case Language.English:GreetEnglishPeople(name);break;case Language.Chinese:GreetChinesePeople(name);break; }}public static void GreetChinesePeople(string name){Console.WriteLine("早上好,"+name);}public static void GreetEnglishPeople(string name){Console.WriteLine("Morning," + name);}}
使用委托的情况
delegate void GreetingDelegate(string name);class Program{static void Main(string[] args){GreetPeople("Jake cheng", new GreetingDelegate(GreetEnglishPeople));//MyDelegate(GreetEnglishPeople)GreetPeople("成龙", GreetChinesePeople);Console.ReadLine();}public static void GreetPeople(string name, GreetingDelegate MyDelegate){MyDelegate(name);}public static void GreetChinesePeople(string name){Console.WriteLine("早上好," + name);}public static void GreetEnglishPeople(string name){Console.WriteLine("Morning," + name);}}
在使用委托的情况下,代码的冗余明显下降。
委托的使用流程
1、声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块
2、使用该委托类型声明一个委托变量
3、创建一个委托类型的对象,并把它赋值给委托变量。新的委托对象包含指向某个方法的一用,这个方法的签名和返回类型必须跟第一步中定义的委托类型一致。
4、你可以选择为委托对象添加其他方法
5、在代码中你可以像调用方法一样调用委托