委托类型表示对具有特定参数列表和返回类型的方法的引用(类似JS的函数指针,但类型安全)。
委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。
静态方法和实例方法均可委托。
通过关键词delegate
声明委托。
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);
Function MyFunction = m.Multiply;
double[] doubles = Apply(a, MyFunction );
}
}
简单的函数也可以用匿名函数形式直接当作参数传入。
double[] doubles = Apply(a, (double x) => x * 2.0);
调用时,委托可以调用多个方法。 这被称为多播。
通过+
、-
、+=
、-=
进行添加/删除方法。方法会按加入的顺序依次执行。
如果委托具有返回值和/或输出参数,它将返回最后一个调用方法的返回值和参数。
delegate int MyFunction(int a, int b);
class Test
{
static int MyAdd(int a, int b)
{
Console.WriteLine(a + b);
return a + b;
}
static int MyMinus(int a, int b)
{
Console.WriteLine(a - b);
return a - b;
}
public Test(int a, int b)
{
MyFunction myFunction = MyAdd;
myFunction += MyMinus;
myFunction += MyMinus;
myFunction -= MyMinus;
Console.WriteLine(myFunction(a, b));
}
}
...
new Test(10, 20);//30 -10 -10
网友评论