Существует небольшая вероятность того, что SomethingHappened
станет null
после нулевой проверки, но до вызова. Тем не менее, MulticastDelagate
s являются неизменяемыми, поэтому, если вы сначала назначите переменную, проверите нулевую проверку по переменной и вызовете ее, вы в безопасности от этого сценария (self plug: я написал в блоге об этом некоторое время назад).
Хотя есть обратная сторона медали; если вы используете подход с использованием временных переменных, ваш код защищен от NullReferenceException
s, но может случиться так, что событие вызовет прослушиватели событий после их отсоединения от события . С этим нужно справиться самым изящным способом.
Чтобы обойти это, у меня есть метод расширения, который я иногда использую:
public static class EventHandlerExtensions
{
public static void SafeInvoke<T>(this EventHandler<T> evt, object sender, T e) where T : EventArgs
{
if (evt != null)
{
evt(sender, e);
}
}
}
Используя этот метод, вы можете вызывать события следующим образом:
protected void OnSomeEvent(EventArgs e)
{
SomeEvent.SafeInvoke(this, e);
}