哥们我刚开始 查了好多资料 发现写的天花乱坠,各种没听过的专业名词,估计是我太菜,反正到底没看懂什么是委托。。
那到底什么是委托?
说说我的理解吧 不对的话还望指正。通俗的讲就是把一个方法当做参数传递给另一个方法。(而这个参数就得是个委托类型)
注意:委托所指向的函数必须跟委托具有相同签名(签名:参数和返回值 重载:方法名相同,返回类型和参数不同)
作用:减少代码冗余,方便快捷,让代码更加规范与简洁
打个比方:假如你在一个类当中写了3个方法,而这三个方法的功能都是三个不通的人在打招呼
先看一个传统的方法调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class Program { static void Main(string[] args) { //1.将字符串每个数组中的元素都转换成大写 //2.将字符串每个数组中的元素都转换成小写 //3.将字符串每个数组中的元素两边都加上双引号 string[] name = { "asdasd", "HHbYhsdJ", "kjjjJGg" }; Program.ProToUpper(name);//静态方法通过类名调用 for (int i = 0; i < name.Length; i++)//遍历输出 { Console.Write(name[i]); } Console.Write("\n"); Program.ToLower(name); for (int i = 0; i < name.Length; i++) { Console.Write(name[i]); } Console.Write("\n"); Program.ShuangYinHao(name); for (int i = 0; i < name.Length; i++) { Console.Write(name[i]); } Console.ReadKey(); } //转大写 public static void ProToUpper(string[] name) { for (int i = 0; i <name.Length ; i++) { name[i] = name[i].ToUpper(); } } //转小写 public static void ToLower(string[] name) { for (int i = 0; i < name.Length; i++) { name[i] = name[i].ToLower(); } } //加双引号 public static void ShuangYinHao(string[] name) { for (int i = 0; i < name.Length; i++) { name[i] = "\"" + name[i] + "\""; } } } |
我们写了三个方法去实现了三个功能相近的方法下面 我们用委托的方法实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//申明一个 指向函数的委托 public delegate string DelFunction1(string name);//委托的签名必须跟方法一样 class Program { static void Main(string[] args) { //1.将字符串每个数组中的元素都转换成大写 //2.将字符串每个数组中的元素都转换成小写 //3.将字符串每个数组中的元素两边都加上双引号 string[] name = { "asdasd", "HHbYhsdJ", "kjjjJGg" }; Midlle1(name, ToUpper); Midlle1(name, ToLower); Midlle1(name, ShuangYinHao); for (int i = 0; i < name.Length; i++) { Console.Write(name[i]); } Console.ReadKey(); } public static void Midlle1(string[] name,DelFunction1 sa)//sa里面装的转大写、转小写、加引号 { for (int i = 0; i < name.Length; i++) { name[i] = sa(name[i]); } } //转小写 public static string ToLower(string name)//申明一个委托(签名必须一样) { return name.ToLower(); } //转大写 public static string ToUpper(string name) { return name.ToUpper(); } //加引号 public static string ShuangYinHao(string name) { return "\"" + name + "\""; } } |
案例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//申明一个委托指向一个方法 public delegate void DelFunction(string name);//注意:委托所指向的函数必须跟委托具有相同签名 //(签名:参数和返回值 class Program { static void Main(string[] args) { Middle("张三",ChineseSay);//传递方法名即可实现调用 Middle("李四", English); Console.ReadKey(); } public static void Middle(string name, DelFunction del) //把声明的委托当作参数传进出 //把函数当做参数传递进来 { del(name);//通过委托调用下面两个方法中的任意一个 //相当于del当中放的是下面的两个方法 } //中文打招呼 public static void ChineseSay(string name) { Console.Write("早上好" + name); } //英语打招呼 public static void English(string name) { Console.Write("Hello" + name); } } |