C#6以降では、次のように使用できます。
MyEvent?.Invoke();
または:
obj?.SomeMethod();
?.
nullで伝播する演算子であり、そして原因となります.Invoke()
オペランドがあるときに短絡されますnull
。オペランドは1回だけアクセスされるため、「チェックと呼び出しの間の値の変更」問題のリスクはありません。
===
C#6より前のバージョンでは、1つを除いて、nullセーフマジックはありません。拡張メソッド-例:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
今これは有効です:
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
イベントの場合、これには競合状態を取り除くという利点があります。つまり、一時的な変数は必要ありません。したがって、通常は次のものが必要です。
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
しかし:
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
簡単に使用できます:
SomeEvent.SafeInvoke(this); // no race condition, no null risk