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); } }
更多建议: