Введение в делегаты и события в C#
В основном курсе уже передавали короткие блоки логики
как значения - через типы вроде Action и Func.
Делегат в объектной модели решает ту же задачу:
метод можно сохранить, передать и вызвать,
когда наступит нужный момент,
не дублируя его тело в каждом месте.
Так связывают части программы, которые не должны знать друг о друге напрямую: источник действия и реакция на него. Один класс выполняет работу, другой подключает обработчик, когда ему нужно отреагировать на результат.
Событие - частный и более строгий случай. Класс-источник сам решает, когда оповестить подписчиков, а внешний код не может произвольно переписать весь список реакций. Это защищает инкапсуляцию и типично для кнопок, таймеров, завершения операций и других сигналов «что-то произошло».