Выбор ответа Junior Делегаты и события обновлено

Безопасный вызов события

Вопрос

Как правильно вызвать событие Changed, у которого может не быть подписчиков?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Changed?.Invoke(this, EventArgs.Empty);. Если подписчиков нет, поле события равно null.

Варианты ответа

  1. Changed(this, EventArgs.Empty);
  2. if (Changed.GetInvocationList().Length > 0) Changed(this, EventArgs.Empty);
  3. Changed?.Invoke(this, EventArgs.Empty);правильный ответ
  4. Changed.Invoke(this, null);

Разбор

Если подписчиков нет, поле события равно null. Оператор ?. один раз читает значение в локальную копию и вызывает только если оно не null, это ещё и защищает от гонки, когда последний подписчик отписывается между проверкой и вызовом. Прямой вызов и GetInvocationList() на null упадут с NullReferenceException.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме