Показанный вами шаблон нарушен в многопоточной среде. MyEventThatIWantToFire
может стать нулевым после теста, но до вызова. Вот более безопасный подход:
EventHandler handler = MyEventThatIWantToFire;
if (handler != null)
{
handler(...);
}
Обратите внимание, что если вы не используете какой-то барьер памяти, нет гарантии, что вы увидите последний набор подписчиков, даже игнорируя очевидное состояние гонки.
Но да, если вы не знаете , что это будет ненулевое значение, вам нужно выполнить проверку или использовать вспомогательный метод, чтобы выполнить проверку за вас.
Один из способов убедиться, что подписчик всегда есть, - это самостоятельно добавить абонента, который не работает, например,
public event EventHandler MyEventThatIWantToFire = delegate {};
Конечно, события не должны быть реализованы с помощью простых полей делегатов. Например, вы могли бы иметь событие, подкрепленное List<EventHandler>
вместо этого, используя пустой список для начала. Это было бы довольно необычно.
Само событие никогда не бывает нулевым, потому что само событие - это просто пара методов (добавить / удалить). Смотрите мою статью о событиях и делегатах для более подробной информации.