Делегаты в C#. Как и где можно использовать MulticastDelegate?
Изучаю C# и столкнулся с MulticastDelegate. Как и зачем их использовать? И также почему event'ы является делегатами, а не отдельной сущностью.
Ответы (1 шт):
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).