Da C # 6 in poi, puoi semplicemente usare:
MyEvent?.Invoke();
o:
obj?.SomeMethod();
Il ?.è l'operatore null-moltiplicazione, e causano la .Invoke()di essere cortocircuitato quando l'operando è null. L'operando è accessibile solo una volta, quindi non c'è il rischio del problema di "cambio di valore tra check e invoke".
===
Prima di C # 6, no: non esiste alcuna magia null-safe, con un'eccezione; metodi di estensione, ad esempio:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
ora questo è valido:
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
In caso di eventi, questo ha il vantaggio di rimuovere anche la race condition, ovvero non serve una variabile temporanea. Quindi normalmente avresti bisogno di:
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
ma con:
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
possiamo usare semplicemente:
SomeEvent.SafeInvoke(this); // no race condition, no null risk