Многоадресные делегаты в C#

Опубликовано: 16 Февраля, 2023

Типобезопасный указатель на функцию является делегатом. Это означает, что делегат содержит ссылку на метод или функцию, и что когда мы вызываем делегат, будет выполнен метод, на который он ссылается. Подпись делегата и метод, на который она указывает, должны быть подписаны. Метод должен быть передан в качестве параметра функции делегата Object() { [собственный код]} при создании экземпляра делегата.

В C# существует два типа делегатов. Это:

  • SingleCast Delegate: отдельная функция или метод называется делегатом.
  • MultiCast Delegate: делегат относится к делегированию нескольких функций или методов.

Многоадресный делегат в С#:

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

Многоадресные делегаты, также называемые комбинированными делегатами, должны соответствовать требованиям, таким как возвращаемый тип делегата, который должен быть недействительным. Параметр типа No Delegate, объявленный как выходной параметр без использования ключевых слов, является параметром типа Delegate. Объединение списков вызовов двух операндов операции сложения дает экземпляр многоадресного делегата путем объединения двух делегатов. Делегаты используются в порядке их добавления.

В C# делегат, который управляет ссылками на несколько функций-обработчиков, называется многоадресным делегатом. Все функции, на которые ссылается многоадресный делегат, будут вызываться при вызове делегата. Все сигнатуры методов должны совпадать, если вы хотите использовать делегат для вызова нескольких методов.

Ключевые факторы, касающиеся многоадресного делегата:

  • Каждый метод вызывается по принципу FIFO (First In, First Out).
  • Методы добавляются к делегатам с помощью оператора + или +=.
  • Методы могут быть исключены из списка делегатов с помощью оператора – или -=.

Пример 1:

C#




// Multicast delegate example in C#
using System;
  
namespace MultDel
{
    public class GFG
    {
        public void Area(double Width, double Height)
        {
            Console.WriteLine($"Area is {Width * Height}");
        }
        public void Perimeter(double Width, double Height)
        {
            Console.WriteLine($"Perimeter is {2 * (Width + Height)}");
        }
        static void Main(string[] args)
        {
            GFG dim = new GFG();
            dim.Area(11.27, 35.75);
            dim.Perimeter(13.25, 45.66);
            Console.ReadKey();
        }
    }
}

Выход:

На приведенном выше рисунке мы сначала создали экземпляр класса GFG перед вызовом двух методов. Теперь я хочу создать одного делегата, который будет вызывать два упомянутых выше метода (т. е. Area и Perimeter). Из-за того, что два метода имеют одинаковую сигнатуру, но разные имена методов, мы можем создать один делегат, содержащий ссылки на оба вышеупомянутых метода. Два упомянутых выше метода будут вызываться при вызове делегата. И когда мы это делаем, C# называет это многоадресным делегатом.

Вывод:

Из приведенной выше информации мы можем сделать вывод, что многоадресный делегат в C# — это делегат, который управляет ссылками на несколько функций-обработчиков. Когда вызывается многоадресный делегат, все функции, на которые он ссылается, также вызываются. Если вы хотите использовать делегат для вызова нескольких методов, все сигнатуры методов должны быть идентичными.