Il y a une petite chance que SomethingHappened
devient null
après la vérification de la nullité mais avant l'invocation. Cependant, MulticastDelagate
sont immuables, donc si vous assignez d'abord une variable, que vous vérifiez que la variable est nulle et que vous l'invoquez, vous êtes à l'abri de ce scénario (self plug : j'ai écrit une article de blog à ce sujet il y a quelque temps).
Il y a cependant un revers de la médaille : si vous utilisez l'approche des variables temporaires, votre code est protégé contre les risques suivants NullReferenceException
mais il se peut que l'événement invoque des récepteurs d'événements. après qu'ils aient été détachés de l'événement . Il s'agit simplement d'une situation à laquelle il faut faire face de la manière la plus élégante possible.
Pour contourner ce problème, j'ai une méthode d'extension que j'utilise parfois :
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);
}
}
}
En utilisant cette méthode, vous pouvez invoquer les événements comme ceci :
protected void OnSomeEvent(EventArgs e)
{
SomeEvent.SafeInvoke(this, e);
}