Dari C # 6 dan seterusnya, Anda bisa menggunakan:
MyEvent?.Invoke();
atau:
obj?.SomeMethod();
Ini ?.
adalah operator yang menyebarkan null, dan akan menyebabkan .Invoke()
hubung singkat saat operannya null
. Operand hanya diakses sekali, jadi tidak ada risiko masalah "perubahan nilai antara check dan pemanggilan".
===
Sebelum C # 6, tidak: tidak ada sihir yang aman-null, dengan satu pengecualian; metode ekstensi - misalnya:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
sekarang ini valid:
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
Dalam kasus event, ini memiliki keuntungan juga karena menghapus kondisi balapan, yaitu Anda tidak memerlukan variabel sementara. Jadi biasanya Anda membutuhkan:
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
tetapi dengan:
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
kita dapat menggunakan secara sederhana:
SomeEvent.SafeInvoke(this); // no race condition, no null risk