前言:当要把要领通报给其他的要领时,需要使用委托。要了解他们的含义,可以看看下面的一行代码:
int number = int.Parse("99");
我们习惯于把数据作为参数通报给要领,如上面的例子所示。所以,给要领通报另一个要领听起来有点奇怪。而有时某个要领执行的操纵并不是针对数据进行的,而是要针对另一个要领进行操纵。更麻烦的是,在编译时我们不知道第二个要领是什么,这个信息只能在运行时知道,所以需要把第二个要领中作为参数通报个第一个要领。
一:委托的声明:
使用委托时,也需要颠末这两个法式:(1):首先要界说使用的委托,对付委托,界说它就是要报告我们的编译器这种类型的委托暗示哪种类型的要领。(2):创建该委托的一个或者多个实例,界说委托的语法如下:
delegate void IntMethodInvoker(int x);
在这个实例中,界说了一个IntMethodInvoker,并指向该委托的实例的每个实例都可以包罗一个要领的引用,该要领带有一个int类型的参数,并返回void。理解委托的一个要点是它们的类型长短常安适的。在界说委托时,必需给出它所暗示的要领的签名和返回类型等全部的细节。
理解委托的一种好方法就是把委托看成是这样的一件工作,它给要领的签名和返回类型指命名称。
假定我们要界说一个委托TwoLongsOp,该委托暗示的要领有两个long型参数,返回类型为double,代码如下:
delegate double TwoLongsOp(long first, long second);
或者是界说一个委托,它暗示的要领不带参数,返回一个string类型的值,可以如下的编写代码:
delegate string GetAString();
其语法类似于要领的界说,但是没有要领体,界说的前面要加上关键字delegate。因为界说委托根基上是界说一个新类,所以可以在界说类的任何的处所界说委托。也就是说,可以在类的内部界说,也可以在类的外部界说,还可以在定名空间中把委托界说为顶层东西。可以在委托的界说应用任意常见的访谒修饰符:public private protected。
界说好一个委托后,就可以创建它的一个实例,从而用它存储特定要领的细节。
给定委托的实例可以引用任何类型的任何东西上的实例要领或者静态要领——主要要领的签名匹配与委托的签名。
二:简单的委托的实例:
界说一个数学运算类(MathOperations),它有两个静态的要领,对double类型的值执行两个操纵。然后使用委托挪用这些要领,数学类代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _12简单的委托的实例 { /// <summary> /// 数学类 /// </summary> public class MathOperstions { /// <summary> /// 该要领是数字乘以2 /// </summary> /// <param>数字</param> /// <returns>返回相乘的数字</returns> public static double MultiplyByTwo(double value) { return value * 2; } /// <summary> /// 数字的平方的要领 /// </summary> /// <param>传入的数字</param> /// <returns>返回数值</returns> public static double Square(double value) { return value*value; } } }
在这里我们可以实例化一个DoubleOp委托的数组,一旦界说了委托类,根基上就可以实例化它的实例,就像措置惩罚惩罚一般的类那样——所以把一些委托的实例放在数组中是可以的。该数组的每个元素都初始化为由MathOperations类实现的差别操纵。然后遍历这个数组,,把每个操纵应用于3个差此外值上。这说明了使用委托的一种方法——把要领组合到一个数组中来使用。这样就可以在循环中挪用差此外要领了。
这段代码的关键是把每个委托通报给ProcessAndDisplayNumber要领,例如:
ProcessAndDisplayNumber(operations[i], 2.0);
此中通报了委托名但是不带任何的参数。假定operations[i]是一个委托,其语法是:
operations[i]暗示这个“委托”。换言之,就是暗示委托的要领。
operations[i](2.0):暗示实际挪用这个要领,参数放在圆括号中。
ProcessAndDisplayNumber 要领界说为把一个委托作为此中的一个参数:
static void ProcessAndDisplayNumber(DoubleOp action, double value)
然后在这个要领中挪用:
//委托的挪用 double result = action(value);
客户端代码如下: