相似于int,string,char等数据类型,委托其实也能够看作一种数据类型。好比,string声明的变量strName能够用来接受字符串,同理,委托声明的变量就能够接受一个方法,以后委托声明的那个变量就能够像方法同样使用,能够看成方法的别名。接下来咱们用实例来解释。编程
先看下面的一段代码:spa
static void Main(string[] args) { int i; //能够接受一个整数的变量 string str; //能够接受一个字符串的变量 }
在Main方法内声明了2个变量:i和str。你们都很熟悉的代码,变量i代表它能够接受一个整数,变量str代表它能够接受一个字符串。code
那么若是我想声明一个变量既能够接受整数又能够接受字符串,那该用什么数据类型来声明这样的变量呢?blog
答案很简单:用class。字符串
public class MyClass { public int i { get; set; } //接受整数 public string str { get; set; } //接受字符串 }
那么咱们就建立了一种数据类型:MyClass,下面用它声明的变量能够同时接受一个整数和一个字符串。get
static void Main(string[] args) { MyClass obj = new MyClass(); obj.i =1; obj.str ="我是字符串"; }
如今问题来了:我想要一种数据类型能够声明一个变量用于接受一个方法。string
既然这种数据类型要接受一个方法,那咱们先看看方法长什么样:class
public string Method(int m,int n) { return ""; }
一般咱们会调用各类方法,调用方法前咱们会肯定方法的输入参数的数据类型和方法输出的数据类型,至于方法的主体咱们一般不关心,方法的主体由方法编程人员去完成便可。变量
对于上面Method方法的输入数据类型为2个整数,输出的是一个字符串。数据类型
如今咱们要声明一个变量来接受这个方法,那么这个变量的数据类型也应该要明确输入,输出的数据类型。那么咱们应该定义符合那个方法输入与输出一致的数据类型。
public class Test { //这种数据类型能够接受一个方法 public delegate string MethodDelegate(int i1,int i2); }
好了,我已经声明了和上面Method方法同样的输入与输出类型的一个数据类型了:MethodDelegate。
那么咱们就能够用这个数据类型来接受Mehtod方法了,完整代码以下:
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用来声明一种数据类型接受方法。
接下来咱们继续解释委托。。。。