组合代表(多播代表)
添加+
和减法 -
操作可用于组合委托实例。代理包含已分配代理的列表。
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace DelegatesExample {
class MainClass {
private delegate void MyDelegate(int a);
private static void PrintInt(int a) {
Console.WriteLine(a);
}
private static void PrintType<T>(T a) {
Console.WriteLine(a.GetType());
}
public static void Main (string[] args)
{
MyDelegate d1 = PrintInt;
MyDelegate d2 = PrintType;
// Output:
// 1
d1(1);
// Output:
// System.Int32
d2(1);
MyDelegate d3 = d1 + d2;
// Output:
// 1
// System.Int32
d3(1);
MyDelegate d4 = d3 - d2;
// Output:
// 1
d4(1);
// Output:
// True
Console.WriteLine(d1 == d4);
}
}
}
在这个示例中,d3
是 d1
和 d2
委托的组合,因此在调用时程序输出 1
和 System.Int32
字符串。
将委托与非 void 返回类型组合:
如果多播委托具有 nonvoid
返回类型,则调用者从最后一个要调用的方法接收返回值。仍然会调用上述方法,但会丢弃它们的返回值。
class Program
{
public delegate int Transformer(int x);
static void Main(string[] args)
{
Transformer t = Square;
t += Cube;
Console.WriteLine(t(2)); // O/P 8
}
static int Square(int x) { return x * x; }
static int Cube(int x) { return x*x*x; }
}
t(2)
将首先调用 Square
然后调用 Cube
。舍弃 Square 的返回值并保留最后一个方法的返回值,即 Cube
。