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