組合代表(多播代表)

新增+和減法 - 操作可用於組合委託例項。代理包含已分配代理的列表。

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