À partir de C # 6, vous pouvez simplement utiliser:
MyEvent?.Invoke();
ou:
obj?.SomeMethod();
Le ?.
est l'opérateur de propagation de null, et provoquera le .Invoke()
court-circuit du lorsque l'opérande est null
. L'opérande n'est accessible qu'une seule fois, il n'y a donc aucun risque de problème de "changement de valeur entre la vérification et l'appel".
===
Avant C # 6, non: il n'y a pas de magie sans valeur nulle, à une exception près; méthodes d'extension - par exemple:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
maintenant c'est valable:
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
Dans le cas des événements, cela a l'avantage de supprimer également la condition de concurrence, c'est-à-dire que vous n'avez pas besoin d'une variable temporaire. Donc normalement vous auriez besoin de:
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
mais avec:
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
on peut utiliser simplement:
SomeEvent.SafeInvoke(this); // no race condition, no null risk