Giả sử tôi muốn kiểm tra một loạt các đối tượng để đảm bảo không có là null:Tôi có thể buộc ngắn mạch của riêng mình trong một cuộc gọi phương thức không?
if (obj != null &&
obj.Parameters != null &&
obj.Parameters.UserSettings != null) {
// do something with obj.Parameters.UserSettings
}
Đó là một viễn cảnh hấp dẫn để viết một hàm helper để chấp nhận một số biến của tham số và đơn giản hóa loại séc:
static bool NoNulls(params object[] objects) {
for (int i = 0; i < objects.Length; i++)
if (objects[i] == null) return false;
return true;
}
Sau đó, đoạn mã trên có thể trở thành:
if (NoNulls(obj, obj.Parameters, obj.Parameters.UserSettings)) {
// do something
}
phải không? Sai. Nếu obj
là không, thì tôi sẽ nhận được NullReferenceException
khi tôi cố gắng chuyển obj.Parameters
đến NoNulls
.
Vì vậy, cách tiếp cận ở trên rõ ràng là sai lầm. Nhưng tuyên bố if
bằng cách sử dụng toán tử &&
chỉ hoạt động tốt vì nó được đoản mạch. Vì vậy: là có cách nào để thực hiện một phương pháp ngắn mạch, để các đối số của nó không được đánh giá cho đến khi được tham chiếu một cách rõ ràng trong phương thức?
Những gì bạn thực sự cần để giải quyết vấn đề này không phải là đánh giá lười biếng của các đối số phương pháp - mặc dù, như bạn lưu ý, điều đó sẽ làm các trick. Điều gì sẽ tốt hơn là một toán tử x.?y có ngữ nghĩa của (x == null? Null: x.y) - theo cách đó bạn có thể nói "if (obj.?Parameters.?UserSettings == null)". Chúng tôi coi như một nhà điều hành cho C# 4 nhưng không bao giờ thực hiện nó. Có lẽ cho một phiên bản tương lai giả định. –
Điều đó thực sự thú vị. Có bất kỳ ngôn ngữ nào khác triển khai toán tử tương đương không? –
@Chris: Groovy. Nó được gọi là toán tử dereferencing null-safe. Thật tốt khi biết rằng nhóm C# đã xem xét và có thể xem xét lại lần nữa :) –