1.委托概述
委托是一种数据类型,像类一样(可以声明委托类型变量)。方法参数可以是int、string、类类型
void M1(int n){ } √
void M2(string s){ } √
void M3(Person p){ } √
委托就是一种数据类型,用来存放方法的数据类型。
那么委托到底把方法存到哪里了?其实委托还是一个类。把方法包装成了一个委托。
方法是不能直接赋值的,那么能不能声明一个能存放方法的变量呢(委托)。像存储变量一样把方法存储起来。
2.委托的使用
声明委托的方式:delegate 返回值类型 委托类型名(参数) 比如delegate void StringProcess(string s); 注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名
存储什么样的方法就声明什么类型(方法参数与返回值)的委托。
声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcess f1;
将委托类型变量指向函数 StringProcess sp = new StringProcess(SayHello),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。
将委托类型变量指向函数还可以简化成StringProcess sp = SayHello,编译器帮我们进行了new。但是不能sp=PrintIt(),因为这样就成了函数调用。
3.委托用例
1 class Program 2 { 3 //定义一个委托类型DelegateString 4 public delegate string DelegateString(string text); 5 //定义一个ChangeString类 6 public class ChangeString 7 { 8 //定义一个ChangeStringText方法,包含一个字符串数组和一个委托变量 9 //ChangeText用来接收传进来的方法 10 public void ChangeStringText(string[] names,DelegateString ChangeText) 11 { 12 for (int i = 0; i < names.Length; i++) 13 { 14 //调用传进来的方法改变字符串 15 names[i] = ChangeText(names[i]); 16 } 17 } 18 } 19 static void Main(string[] args) 20 { 21 ChangeString cs=new ChangeString(); 22 string[] names = {"卡卡西","佐助","鸣人"}; 23 //调用ChangeStringText方法,把names数组和JoinString方法传进去 24 cs.ChangeStringText(names, JoinString); 25 //遍历输出改变后的数组 26 for (int i = 0; i < names.Length; i++) 27 { 28 Console.WriteLine(names[i]); 29 } 30 Console.ReadKey(); 31 } 32 //定义一个NewString方法 33 public static string NewString(string name) 34 { 35 return "----"+name+"----"; 36 } 37 //定义一个JoinString 38 public static string JoinString(string name) 39 { 40 return "★" + name + "★"; 41 } 42 }