Looking for c# Keywords? Try Ask4Keywords

C# Language Объединение делегатов (многоадресные делегаты)


пример

Сложение + и вычитание - операции могут быть использованы для объединения экземпляров делегата. Делегат содержит список назначенных делегатов.

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 .


Объединение делегатов с непустыми возвращаемыми типами:

Если групповой делегат имеет 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 сохраняется.