C# 委托
C#委托
委托是调用方法的对象。我们可以认为委托是函数指针或函数类型。
委托类型定义委托实例可以调用的方法类型。
委托类型定义方法的返回类型及其参数类型。
例子
下面定义一个称为Converter的委托类型:
delegate int Converter (int x);
Converter 与任何方法与 int 返回类型和单个 int 参数兼容,如:
static int Square (int x) { return x * x; }
将一个方法分配给一个委托变量创建一个委托实例:
Converter t = Square;
其可以以与方法相同的方式被调用:
int answer = t(3); // answer is 9
例2
这里是一个完整的例子:
delegate int Converter (int x);
class Test {
static void Main() {
Converter t = Square; // Create delegate instance
int result = t(3); // Invoke delegate
Console.WriteLine (result); // 9
}
static int Square (int x) { return x * x; }
}
delegate实例充当调用者的委托:调用者调用delegate,然后委托调用目标方法。
委托类似于C函数指针。
多播委托
一个委托实例可以引用多个目标方法。
+ 和 + = 运算符合并了委托实例。
例如:
MyDelegate d = methodB; d += methodA;
调用d现在将调用 methodB 和 methodA 。
将按添加的顺序调用代理。
- 和 -=运算符从左代表中删除正确的代理操作数操作数。 例如:
d -= methodB;
调用 d 现在将仅调用 methodA 。
我们可以为委托分配一个空值:
MyDelegate d = null; d += methodB; // Equivalent (when d is null) to d = methodB;
如果多播委托具有非void返回类型,则调用者从最后一个要调用的方法接收返回值。
前面的方法仍然被调用,但是它们的返回值被丢弃。
所有委托类型隐含地派生自System.MulticastDelegate,它继承自 System.Delegate 。
实例 vs 静态方法目标
当实例方法分配给委托对象时,委托对象维护方法所属的方法和实例的引用。
System.Delegate 类的Target属性表示此实例。
例如:
public delegate void Printer (int percentComplete);
class Test {
static void Main() {
X x = new X();
Printer p = x.methodA;
p(1);
Console.WriteLine (p.Target == x); // True
Console.WriteLine (p.Method); // Void methodA(Int32)
}
}
class X {
public void methodA (int percentComplete) {
Console.WriteLine (percentComplete);
}
}