C#-委托delegate
通常情况下,函数内部需要调用其他函数来实现代码的重用,但这样有一个问题:
如果需要更换所调用的函数则需要对该函数的定义再次修改,
事实上,在程序运行过程中,函数也是作为一个存储在堆中的对象,
这样我们也可以通过设置引用函数的变量的方式实现方法调用的修改,
这种引用函数的变量被称为委托类型变量。
使用引用类型步骤如下:
1、声明委托数据类型
由于函数可以通过名称、返回值、参数类型及个数等方面区分出许多不同类型。
因此使用委托类型需要首先声明所调用的函数属于什么类型,格式如下:
public delegate T FunctionType<T>(T a,T b);
从类型定义中,我们可以看到,委托类型所调用的函数需要返回值类型和参数列表匹配才能正常使用。
(对于类型多样的返回值和参数列表,可以定义泛型委托)
2、在函数生命时使用定义好的委托类型做参数
public static T Call<T>(T a,T b,FunctionType<T> functionName) where T:struct
{
return functionName(a,b);
}
3、存在多个除函数名外相同类型的函数可以调用
static int Add(int a,int b)
{
return a + b;
}
static int Sub(int a,int b) { return a - b; }
4、函数调用时将函数名作为参数传递
Console.WriteLine(ToolTestDelegate.Call<int>(2, 3, Add));
Console.WriteLine(ToolTestDelegate.Call<int>(2,3,Sub));
5、System空间中定义了很多委托(最多可以有16个参数)
视图->对象浏览器
(1)Func带返回值的委托
Func<int, int, int> func = Add;
Console.WriteLine(func(1, 2));
(2)Action不带返回值的委托
Action<Animal> action = MakeAnimal2;
action(new Dog());
6、委托合并(委托多播)
d1 = method1;
d2 = method2;
d3 = d1 + d2;
d3("C");//同时调用method1和method2