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     }
View Code

相关文章: