组合代表(多播代表)

添加+和减法 - 操作可用于组合委托实例。代理包含已分配代理的列表。

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);
        }
    }
}

在这个示例中,d3d1d2 委托的组合,因此在调用时程序输出 1System.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