Делегаты в C#. Как и где можно использовать MulticastDelegate?

Изучаю C# и столкнулся с MulticastDelegate. Как и зачем их использовать? И также почему event'ы является делегатами, а не отдельной сущностью.


Ответы (1 шт):

Автор решения: aepot

MulticastDelegate (ссылка)

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

Грубо говоря добавляя более одного метода в делегат вы делаете его мультикастом.

myDelegate = Method1;
myDelegate += Method2;
myDelegate(); // вызовется сначала Method1, затем Method2

События это частный случай делегатов, они не "почему" делегаты, они просто делегаты. Разница только в доступности вызвать этот делегат.

Например вот 2 варианта

public MyClass
{
    public event Action MyEvent;
    public Action MyDelegate;
}

И вот разница

var instance = new MyClass();
instance.MyDelegate(); // работает
instance.MyEvent(); // ошибка

То есть за пределами кода класса событие вызвать нельзя. Больше ничем события от любых других делегатов не отличаются.

Еще события можно делать свойствами с методами add/remove, очень похоже на get/set обычных свойств, только для подписывания += и отписывания -=. Требуется для пробрасывания внутренних событий, например из классов, которые вы не можете изменять, наружу, при необходимости вклиниваясь в логику добавления и удаления обработчиков события.

private event Action myEvent; // здесь кстати event указывать необязательно

public event Action MyEvent // а здесь обязательно
{
    add => myEvent += value;
    remove => myEvent -= value;
}

С делегатами такое вытворять нельзя, но можете пока не обращать на этот маленький нюанс внимания.

Подробнее о том, зачем так сделано с событиями, можно почитать в описании шаблона проектирования Издатель/Подписчик (Publisher/Subscriber).

→ Ссылка