Мультикаст-делегаты в C#
Делегаты, которые включают в себя больше одного метода, называют мультикаст-делегатами. В процессе вызова они выполняют каждый метод в заданном порядке и позволяют тем самым связывать в цепочку несколько методов.
Для работы таких делегатов они не должны возвращать какой-нибудь результат. Иначе произойдет обработка результата последнего метода цепочки.
Рассмотрим пример применения мультикаст-делегата при выводе приветствия:
В следующем примере код позволяет умножать полученное число на 2 и возводить это же число в квадрат:
Также будет нелишним рассмотреть типы делегатов.
Типы делегатов
System.Delegate
Тут смысл тот же, что и у указателей на методы в языке программирования C++. Правда, в C# делегаты не задействуют указатели, а сохраняют метаданные, которые определяют целевой метод для последующего вызова.
Кроме этого, System.Delegate содержит экземпляр класса System.Reflection.MethodInfo — это метаданные .NET, необходимые для вызова метода через отражения.
Очередной важный аспект System.Delegate — экземпляр объекта, для которого осуществляется вызов метода. Если существует неограниченное количество объектов с нужной сигнатурой, нам надо определить, какому конкретно объекту его назначить.
Исключением является применение статичного метода, который определен MetodInfo, — в данном случае ссылка на объект вернёт null.
System.MulticastDelegate
Этот тип дает возможность применять делегаты для нескольких объектов. Все это благодаря тому, что делегаты типа System.MulticastDelegate включают в себя экземпляр этого же класса, создаваемый в случае назначения объекта предыдущему классу. Новый экземпляр получает ссылку на последующий объект списка экземпляров делегатов. В результате System.MulticastDelegate поддерживает связанный перечень объектов для делегатов.
Цепочка делегатов
В случае вызова мультикаст-делегатов каждый экземпляр в цепочке будет вызываться последовательно. Но это может обернуться проблемой, когда в одном из экземпляров сработает исключение либо он вернет результат не void-типа.
На этом всё: мы рассмотрели принципы работы мультикаст-делегатов на C#, а также примеры их реализации.