委托Delegates
本文内容
委托类型表示对具有特定参数列表和返回类型的方法的引用。通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。委托类似于其他一些语言中的函数指针概念,但与函数指针不同的是,委托不仅面向对象,还类型安全。
下面的示例声明并使用 Function
委托类型。
using System;
delegate double Function(double x);
class Multiplier
{
double factor;
public Multiplier(double factor)
{
this.factor = factor;
}
public double Multiply(double x)
{
return x * factor;
}
}
class DelegateExample
{
static double Square(double x)
{
return x * x;
}
static double[] Apply(double[] a, Function f)
{
double[] result = new double[a.Length];
for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
return result;
}
static void Main()
{
double[] a = {0.0, 0.5, 1.0};
double[] squares = Apply(a, Square);
double[] sines = Apply(a, Math.Sin);
Multiplier m = new Multiplier(2.0);
double[] doubles = Apply(a, m.Multiply);
}
}
Function
委托类型实例可以引用需要使用 double
自变量并返回 double
值的方法。Apply
方法将给定的函数应用于 double[]
的元素,从而返回包含结果的 double[]
。在 Main
方法中,Apply
用于向 double[]
应用三个不同的函数。
委托可以引用静态方法(如上面示例中的 Square
或 Math.Sin
)或实例方法(如上面示例中的 m.Multiply
)。引用实例方法的委托还会引用特定对象,通过委托调用实例方法时,该对象会变成调用中的 this
。
还可以使用匿名函数创建委托,这些函数是便捷创建的“内联方法”。匿名函数可以查看周围方法的局部变量。因此,可以更轻松地编写上面的乘数示例,而无需使用 Multiplier 类:
double[] doubles = Apply(a, (double x) => x * 2.0);
委托的一个有趣且有用的属性是,它不知道也不关心所引用的方法的类;只关心引用的方法是否具有与委托相同的参数和返回类型。