Защищенный список обработчиков в C#
Публичное поле-делегат снаружи можно обнулить или переприсвоить одной записью. Событие закрывает эту лазейку: внешний код не может подменить весь список обработчиков, хотя владелец класса по-прежнему хранит делегат внутри.
В объявлении класса перед типом делегата ставят модификатор события. Запишем класс с полем оповещения о завершении работы:
class Notifier {
public event Action? Done;
}
Снаружи запрещено присваивание целиком: строка с одним знаком равенства для этого поля не компилируется. Добавление и снятие отдельных обработчиков оформляют другими операциями; здесь важно само объявление с ограничением доступа:
void OnPing() {
Console.WriteLine("ping");
}
Hub hub = new Hub();
// hub.Ping = OnPing;
class Hub {
public event Action? Ping;
}
Сделайте класс Bell с публичным полем
оповещения Ring: снаружи должно быть можно
подключать и отключать отдельные обработчики,
но нельзя заменить весь список одним присваиванием.
Достаточно объявления класса с таким полем.