Tôi biết mình đã trễ kinh nghiệm với câu hỏi này, nhưng tôi cảm thấy câu trả lời sẽ trở nên phù hợp khi phiên bản chính mới nhất của C # đến gần hơn để phát hành, sau đó được phát hành. Trong C # 8.0, một thay đổi lớn sẽ xảy ra, C # sẽ cho rằng tất cả các kiểu được coi là không rỗng.
Theo Mads Torgersen:
Vấn đề là tham chiếu null rất hữu ích. Trong C #, chúng là giá trị mặc định của mọi loại tham chiếu. Giá trị mặc định khác sẽ là gì? Giá trị nào khác mà một biến sẽ có, cho đến khi bạn có thể quyết định điều gì khác để gán cho nó? Giá trị nào khác mà chúng ta có thể mở rộng một mảng tham chiếu mới được phân bổ, cho đến khi bạn bắt đầu điền vào nó?
Ngoài ra, đôi khi null là một giá trị hợp lý trong và của chính nó. Đôi khi bạn muốn trình bày một thực tế rằng, một trường không có giá trị. Rằng việc chuyển “nothing” cho một tham số là ok. Tuy nhiên, sự nhấn mạnh là đôi khi. Và ở đây nằm ở một phần khác của vấn đề: Các ngôn ngữ như C # không cho phép bạn diễn đạt liệu giá trị rỗng ở đây có phải là một ý tưởng tốt hay không.
Vì vậy, giải pháp được đưa ra bởi Mads, là:
Chúng tôi tin rằng thông thường hơn là muốn một tham chiếu không bị rỗng. Loại tham chiếu rỗng sẽ là loại hiếm hơn (mặc dù chúng tôi không có dữ liệu tốt để cho chúng tôi biết bao nhiêu), vì vậy chúng là những loại cần phải có chú thích mới.
Ngôn ngữ này đã có khái niệm về - và cú pháp cho - các kiểu giá trị nullable. Sự tương đồng giữa cả hai sẽ làm cho việc bổ sung ngôn ngữ dễ dàng hơn về mặt khái niệm và đơn giản hơn về mặt ngôn ngữ.
Có vẻ như bạn không nên tạo gánh nặng cho bản thân hoặc người tiêu dùng của mình bằng các giá trị rỗng, trừ khi bạn đã chủ động quyết định rằng bạn muốn chúng. Nulls, không phải sự vắng mặt của chúng, phải là thứ mà bạn rõ ràng phải chọn tham gia.
Ví dụ về tính năng mong muốn:
public class Person
{
public string Name { get; set; } // Not Null
public string? Address { get; set; } // May be Null
}
Bản xem trước có sẵn cho bản xem trước Visual Studio 2017, 15.5.4+.