Từ C # 6 trở đi, bạn chỉ có thể sử dụng:
MyEvent?.Invoke();
hoặc là:
obj?.SomeMethod();
Các ?.
là các nhà điều hành null-tuyên truyền, và sẽ gây ra .Invoke()
để được ngắn mạch khi các toán hạng lànull
. Toán hạng chỉ được truy cập một lần, do đó không có rủi ro về vấn đề "thay đổi giá trị giữa kiểm tra và gọi".
===
Trước C # 6, không: không có phép thuật nào an toàn, với một ngoại lệ; các phương pháp mở rộng - ví dụ:
public static void SafeInvoke(this Action action) {
if(action != null) action();
}
bây giờ điều này là hợp lệ:
Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"
Trong trường hợp sự kiện, điều này có lợi thế là cũng loại bỏ điều kiện chủng tộc, tức là bạn không cần một biến tạm thời. Vì vậy, thông thường bạn cần:
var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);
nhưng vơi:
public static void SafeInvoke(this EventHandler handler, object sender) {
if(handler != null) handler(sender, EventArgs.Empty);
}
chúng ta có thể sử dụng đơn giản:
SomeEvent.SafeInvoke(this); // no race condition, no null risk