Групповые делегаты в C#

Групповые делегаты (Multicast Delegates) позволяют хранить ссылки на несколько методов и вызывать их последовательно. Они используются для обработки событий и выполнения нескольких операций одним вызовом.

Объявление и использование групповых делегатов

Групповой делегат объявляется аналогично обычному, но поддерживает добавление нескольких методов через оператор +=.

delegate void MyDelegate(string message);

class Program
{
    static void PrintMessage(string message) => Console.WriteLine($"Message: {message}");
    static void PrintUpperMessage(string message) => Console.WriteLine($"Uppercase: {message.ToUpper()}");

    static void Main()
    {
        MyDelegate del = PrintMessage;
        del += PrintUpperMessage;
        del("Hello");
    }
}

Вывод:

Message: Hello
Uppercase: HELLO

Удаление методов из списка вызова

Методы можно удалять с помощью оператора -=.

delegate void MyDelegate(string message);

class Program
{
    static void PrintMessage(string message) => Console.WriteLine($"Message: {message}");
    static void PrintUpperMessage(string message) => Console.WriteLine($"Uppercase: {message.ToUpper()}");

    static void Main()
    {
        MyDelegate del = PrintMessage;
        del += PrintUpperMessage;
        del -= PrintMessage;
        del("Hello");
    }
}

Вывод:

Uppercase: HELLO

Групповые делегаты и возвращаемые значения

Если методы в делегате имеют возвращаемое значение, будет получен результат только последнего вызванного метода.

delegate int MyDelegate();

class Program
{
    static int FirstMethod() => 1;
    static int SecondMethod() => 2;

    static void Main()
    {
        MyDelegate del = FirstMethod;
        del += SecondMethod;
        int result = del();
        Console.WriteLine(result);
    }
}

Вывод:

2

Групповые делегаты позволяют объединять несколько методов в один вызов, что удобно для событий и многократных обработок данных.