ตั้งแต่ C # 6 เป็นต้นไปคุณสามารถใช้:
MyEvent?.Invoke();
หรือ:
obj?.SomeMethod();
?.
เป็นผู้ประกอบการ null แพร่กระจายและจะทำให้เกิดการที่จะลัดวงจรเมื่อถูกดำเนินการคือ.Invoke()
null
มีการเข้าถึงตัวถูกดำเนินการเพียงครั้งเดียวดังนั้นจึงไม่มีความเสี่ยงที่จะเกิดปัญหา "การเปลี่ยนแปลงค่าระหว่างการตรวจสอบและเรียกใช้"
===
ก่อนหน้า C # 6 ไม่: ไม่มีเวทย์มนตร์ที่ปลอดภัยโดยมีข้อยกเว้นหนึ่งข้อ วิธีการขยาย - ตัวอย่างเช่น:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
ตอนนี้ใช้ได้แล้ว:
Action act = null;
act.SafeInvoke();
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke();
ในกรณีของเหตุการณ์นี้มีข้อดีของการลบเงื่อนไขการแข่งขันเช่นคุณไม่ต้องการตัวแปรชั่วคราว โดยปกติคุณจะต้อง:
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);