Tôi nghĩ ngôn ngữ C# thực sự có thể sử dụng toán tử mới cho loại logic này - nó khá phổ biến và một toán tử sẽ đơn giản hóa vô số dòng mã.
Chúng tôi cần điều gì đó dọc theo dòng của "??" hoặc "nếu null sau đó" nhà điều hành, nhưng hoạt động như đặc biệt '.' dot toán tử với một điều kiện "nếu không null". Đối với "??", chữ cái đầu tiên '?' giống như phần 'if' của "?:" nếu-thì, và phần thứ hai '?' đại diện cho 'null' như cho các kiểu nullable. Tôi nghĩ chúng ta cần một ".?" toán tử hoạt động giống như '.', ngoại trừ nó chỉ đơn giản là đánh giá null nếu biểu thức bên trái là null thay vì ném một ngoại lệ. Tôi đoán nó sẽ là một "dot không null" nhà điều hành (OK, vì vậy có lẽ ".!?" Sẽ hợp lý hơn, nhưng chúng ta hãy không đi đến đó).
Vì vậy, ví dụ oh-so-chung của bạn có thể bị mất tên biểu tượng dư thừa như thế này:
var a = long_expression.?Method();
Có một tấn C# mã ra khỏi đó với kiểm tra rỗng lồng nhau rằng sẽ có lợi rất nhiều. Chỉ cần nghĩ như thế nào đẹp nó sẽ nếu điều này:
if (localObject != null)
{
if (localObject.ChildObject != null)
{
if (localObject.ChildObject.ChildObject != null)
localObject.ChildObject.ChildObject.DoSomething();
}
}
có thể trở thành chỉ:
localObject.?ChildObject.?ChildObject.?DoSomething();
Ngoài ra còn có một tấn mã nơi kiểm tra không cho rằng nên có mặt ở đó đang thiếu, dẫn đến lỗi runtime thường xuyên. Vì vậy, thực sự sử dụng '.?' Mới nhà điều hành theo mặc định sẽ loại bỏ các vấn đề như vậy ... Có lẽ không may là chúng tôi không thể đảo ngược hành vi của '.' và '.?' vào thời điểm này, vì vậy chỉ có '.?' mới ném một ngoại lệ nếu bên trái là null - nó sẽ là sạch hơn và hợp lý hơn để đi, nhưng phá vỡ những thay đổi là rất xấu. Mặc dù, người ta có thể lập luận rằng sự thay đổi đặc biệt này có thể sẽ khắc phục được rất nhiều vấn đề ẩn, và khó có thể phá vỡ bất cứ điều gì (chỉ có mã dự kiến một ngoại lệ không được phép bỏ). Ồ, vâng ... người ta luôn có thể mơ ước ...
Nhược điểm duy nhất để kiểm tra giá trị rỗng thực sự là hiệu suất nhỏ, điều chắc chắn nhất là tại sao '.' không kiểm tra null. Nhưng, tôi thực sự nghĩ rằng khả năng chỉ sử dụng '.?' khi bạn quan tâm đến hiệu suất (và biết phía bên trái sẽ không bao giờ là null) sẽ là cách tốt hơn để đi.
Trên một lưu ý tương tự, việc kiểm tra 'bỏ qua' và bỏ qua một bộ sưu tập rỗng cũng sẽ đẹp hơn rất nhiều. Không cần phải bọc hầu hết các câu lệnh 'foreach' với "if (collection! = Null)", hay tệ hơn, phát triển thói quen chung luôn sử dụng các bộ sưu tập rỗng thay vì null ... điều này tốt trong một số trường hợp, nhưng thậm chí tệ hơn vấn đề hiệu suất hơn kiểm tra null khi điều này được thực hiện trong cây đối tượng phức tạp, nơi phần lớn các bộ sưu tập trống (mà tôi đã nhìn thấy rất nhiều). Tôi nghĩ rằng ý định tốt của việc không có 'foreach' kiểm tra cho null để cung cấp hiệu suất tốt hơn đã phản tác dụng trong phần lớn các trường hợp.
Anders, không bao giờ là quá muộn để thực hiện các thay đổi đó và thêm trình chuyển đổi trình biên dịch để bật chúng!
'var a = temp? null: temp.Method(); 'Tôi nghĩ rằng bạn có nghĩa là để có' var a = temp == null? null: temp.method(); 'Chi tiết nhỏ mặc dù – Sephallia
Tôi nghĩ rằng phương pháp hiện tại của bạn là con đường để đi. –
"Cú pháp tốt nhất" theo ràng buộc "ngôn ngữ == C#" hoặc cho các nội dung như vậy nói chung? Rõ ràng một cái gì đó như thế này có thể được viết khá tốt hơn trong một ngôn ngữ chức năng, sử dụng (applicative) functors/monads và như vậy. – leftaroundabout