Delegate,委托,是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
delegate int GetCalculatedValueDelegate(int x, int y);
在上面的定义中,我们定义了一个委托,这个委托代表着一类函数,这些函数的第一个参数是整数型的x,第二个参数是整数型的y,而函数的返回值则是一个整数。在这里,为了描述方便,我们把这一类的函数称为具有相同签名(signature)的函数(注意:这个签名并不是数字签名中的概念,而只是表示这类函数具有相同的参数列表和返回值)。
既然委托是一种类型,那么它就能被用来定义参数、变量以及返回值。由委托定义的变量用于保存具有相同签名的函数实体。需要注意的是,C#和C++不同,C++中的函数指针只能保存全局的或者静态的函数,而C#中的委托实体则可以指代任何函数。
现在我们来看一个例子,
上面的例子是一个基于窗体的例子,但窗体大多数读者都应该能做出来,如果确实需要解决方案(VS里的),在文章末尾有笔者的联系方式。
到这里也就能基本上明白“委托”的意义了,本来需要调用_2函数的,却通过_1来调用了,也就是,_2的操作由_1的参数中的委托代为效劳。本来是要小明去老师办公室拿粉笔盒的,由于小明和小文是好朋友,因此小明就要小文代他去拿,于是小文成了小明的代理,小明委托小文去拿粉笔盒。
忘了一点,委托也可以有返回值和参数,这个函数差不多,但跟函数有一定的区别,委托是代为别人效劳。