Выбор ответа Junior Делегаты и события обновлено
Безопасный вызов события
Вопрос
Как правильно вызвать событие Changed, у которого может не быть подписчиков?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Changed?.Invoke(this, EventArgs.Empty);. Если подписчиков нет, поле события равно null.
Варианты ответа
Changed(this, EventArgs.Empty);if (Changed.GetInvocationList().Length > 0) Changed(this, EventArgs.Empty);Changed?.Invoke(this, EventArgs.Empty);правильный ответChanged.Invoke(this, null);
Разбор
Если подписчиков нет, поле события равно null. Оператор ?. один раз читает значение в локальную копию и вызывает только если оно не null, это ещё и защищает от гонки, когда последний подписчик отписывается между проверкой и вызовом. Прямой вызов и GetInvocationList() на null упадут с NullReferenceException.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Делегаты и события»
- Как компилятор реализует замыкание
- Замыкание на переменную цикла for
- Утечка памяти через событие
- Чем event отличается от поля-делегата
- Стандартный шаблон события
- Исключение в одном из подписчиков
- Объявление и вызов события
- Подписки на темы: события и отписка