从今天开始写关于C#的系列文章,本篇文章主要讲解C#中的委托使用。
委托其实就是一种数据类型,和int,string是一样的概念。
如果要把一个字符串赋值给一个变量,用string声明一个变量即可。如果要把一个方法赋值给一个变量,那么用什么关键字呢?当然就是用委托了,所以用委托声明的变量就可以接受一个方法了,之后那个变量就可以像方法一样执行。
下面开始详细介绍:
先看一段代码:
1
2
3
4
5
|
static void Main( string [] args) { int i; //可以接受一个整数的变量 string str; //可以接受一个字符串的变量 } |
在Main方法内声明了2个变量:i和str。大家都很熟悉的代码,变量i表明它可以接受一个整数,变量str表明它可以接受一个字符串。
那么如果我想声明一个变量既可以接受整数又可以接受字符串,那该用什么数据类型来声明这样的变量呢?
答案很简单:用class。
1
2
3
4
5
|
public class MyClass { public int i { get ; set ; } //接受整数 public string str { get ; set ; } //接受字符串 } |
那么我们就创建了一种数据类型:MyClass,用它声明的变量可以同时接受一个整数和一个字符串。
如下:
1
2
3
4
5
6
|
static void Main( string [] args) { MyClass obj = new MyClass(); obj.i =1; obj.str = "我是字符串" ; } |
现在问题来了:我想要一种数据类型可以声明一个变量用于接受一个方法。
既然这种数据类型要接受一个方法,那我们先看看方法长什么样:
1
2
3
4
|
public string Method( int m, int n) { return "" ; } |
上面的Method方法最主要的特点就是这个方法的输入参数数据类型与输出的数据类型。
通常我们会调用各种方法,调用方法前我们会确定方法的输入参数的数据类型和方法输出的数据类型,至于方法的主体我们通常不关心,方法的主体由方法编程人员去完成即可。
所以我们编写一个方法,调用一个方法前都要明确的方法的输入输出数据类型。
对于上面Method方法的输入数据类型为2个整数,输出的是一个字符串。
现在我们要声明一个变量来接受这个方法,那么这个变量的数据类型也应该要明确输入,输出的数据类型。那么我们应该定义符合那个方法输入与输出一致的数据类型。
1
2
3
4
5
|
public class Test { //这种数据类型可以接受一个方法 public delegate string MethodDelegate( int i1, int i2); } |
好了,我已经声明了和上面Method方法一样的输入与输出类型的一个数据类型了:MethodDelegate。
那么我们就可以用这个数据类型来接受Mehtod方法了,完整代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Program { //这种数据类型可以接受一个方法 public delegate string MethodDelegate( int i1, int i2); /// <summary> /// 我们可以用MethodDelegate声明一个变量来接受方法了 /// </summary> public void Test() { MethodDelegate IamMethod = Method; //把下面那个Method方法赋值给变量了。 var result=IamMethod(1, 2); //然后把这个变量当作方法一样执行即可。 } public string Method( int m, int n) { return "" ; } } |
在上面第4行:我们用delegate关键字声明了一种数据类型:这种数据类型和我们想要接受什么样方法的输入输出类型保持一致就可以了。
那么上面的MethodDelegate就可以接受带2个int类型的输入参数并且返回类型是string的任何方法了。
现在我们发现委托和int,string是一样的概念,只不过,int用来接受整数,string用来接受字符串,delegate用来声明一种数据类型接受方法。