C#进阶之路(一):委托

时间:2022-05-19 06:30:51

一、什么是委托

  简单说它就是一个能把要领当参数通报的东西,而且还知道怎么挪用这个要领,同时也是粒度更小的“接口”(约束了指向要领的签名)

  委托是一个类,它界说了要领的类型,使得可以将要领看成另一个要领的参数来进行通报,是种将要领动态地赋给参数的做法。

  用过C/C++的,对委托不会陌生,委托可以当作函数指针的升级版本!

  函数指针简介:

  下面是一段C措施,Calc就是界说的函数指针。

typedef int (* Calc)(int a, int b); int Add(int a, int b) { int result = a + b; return result; } main() { int x = 100; int y = 200; int z = 0; Calc funcPoint1 = &Add; z = funcPoint1(x, y); printf("%d \n", z); }

这段措施很好的浮现了一切皆地点的思想,变量和函数都是地点。

直接挪用和间接挪用的效果是一致的,都是访谒阿谁内存地点,委托相当于函数指针的升级版。

  委托的简单案例

  一个委托类型界说了该类型的实例能挪用的一类要领,这些要领含有同样的返回类型和同样参数(类型和个数不异)。

委托是一个类,所以要在类声明的位置进行声明,而不是写在类里面,那样就写成嵌套类了。如下界说了一个委托类型 - Calculator:

delegate int Calculator (int x);

此委托适用于任何有着int返回类型和一个int类型参数的要领,如:

static int Double (int x) { return x * 2; }

创建一个委托实例,将该此要领赋值给该委托实例:

Calculator c = new Calculator(Double);

也可以简写成:

Calculator c = Double;

这个要领可以通过委托挪用:

int result = c(2);

下面是完整代码:

delegate int Calculator(int x); class Program { static int Double(int x) { return x * 2; } static void Main(string[] args) { Calculator c = Double;     //c 就是委托实例, int result = c(2); Console.Write(result); Console.ReadKey(); } }

二、委托的一般使用 2.1用委托实现插件式编程

  我们可以操作“委托是一个能把要领作为参数通报的东西”这一特点,来实现一种插件式编程。

  例如,我们有一个Utility类,这个类实现一个通用要领(Calculate),用来执行任何有一个整型参数和整型返回值的要领。这样说有点抽象,下面来看一个例子:

delegate int Calculator(int x); //这里界说了一个委托 class Program { static int Double(int x) { return x * 2; } static void Main(string[] args) { int[] values = { 1,2,3,4}; Utility.Calculate(values, Double); foreach (int i in values) Console.Write(i + " "); // 2 4 6 8 Console.ReadKey(); } } class Utility { public static void Calculate(int[] values, Calculator c) { // Calculator c 是简单委托的变种写法,就是把实例化放在了形参界说的语句里 //但是这个实例化具体对应的是什么要领,只有真的传入参数的时候才知道! for (int i = 0; i < values.Length; i++) values[i] = c(values[i]); } }

  这个例子中的Utility是固定不乱的,措施实现了整数的Double成果。我们可以把这个Double要领看作是一个插件,如果将来还要实现诸如求平方、求立方的计算,我们只需向措施中不停添加插件就可以了。