Tính năng này ở số Spec#. Chúng được mặc định là tham chiếu nullable và được sử dụng! để chỉ ra các giá trị không null. Điều này là bởi vì họ muốn tương thích ngược.
Trong ngôn ngữ mơ ước của tôi (trong đó tôi có thể là người dùng duy nhất!) Tôi sẽ đưa ra lựa chọn tương tự như bạn, không thể vô hiệu theo mặc định.
Tôi cũng sẽ làm cho việc sử dụng. nhà điều hành trên một tham chiếu nullable (hoặc bất cứ điều gì khác mà sẽ dereference nó). Bạn sẽ sử dụng chúng như thế nào? Bạn sẽ phải chuyển đổi chúng thành không phải nullables trước. Bạn sẽ làm điều này như thế nào? Bằng cách kiểm tra chúng cho null.
Trong Java và C#, câu lệnh if
chỉ có thể chấp nhận biểu thức kiểm tra bool
. Tôi muốn mở rộng nó để chấp nhận tên của biến tham chiếu có thể vô hiệu hóa:
if (myObj)
{
// in this scope, myObj is non-nullable, so can be used
}
Cú pháp đặc biệt này sẽ không gây ngạc nhiên cho người lập trình C/C++. Tôi thích một cú pháp đặc biệt như thế này để làm cho nó rõ ràng rằng chúng tôi đang làm một kiểm tra mà sửa đổi các loại tên myObj
trong sự thật-chi nhánh.
Tôi muốn thêm một chút nữa đường:
if (SomeMethodReturningANullable() into anotherObj)
{
// anotherObj is non-nullable, so can be used
}
này chỉ cung cấp cho các tên anotherObj
đến kết quả của biểu thức ở bên trái của into
, vì vậy nó có thể được sử dụng trong phạm vi nơi nó hợp lệ.
Tôi sẽ làm điều tương tự cho toán tử ?:
.
string message = GetMessage() into m ? m : "No message available";
Lưu ý rằng string message
là không nullable, nhưng như vậy là hai kết quả có thể có của các bài kiểm tra trên, vì vậy việc chuyển nhượng là giá trị.
Và sau đó có thể là một chút đường đối với trường hợp có lẽ phổ biến thay thế một giá trị cho null:
string message = GetMessage() or "No message available";
Rõ ràng or
sẽ chỉ được hợp lệ áp dụng cho một loại nullable ở phía bên trái, và một phi nullable ở phía bên phải.
(Tôi cũng muốn có một built-in khái niệm về quyền sở hữu cho instance fields;. Trình biên dịch sẽ tạo ra các phương pháp IDisposable.Dispose
tự động, và cú pháp ~Destructor
sẽ được sử dụng để tăng thêm Dispose
, chính xác như trong C++/CLI)
SpeC# đã có một phần mở rộng cú pháp liên quan đến phi nullables, do các vấn đề về đảm bảo rằng không nullables đã được khởi tạo một cách chính xác trong quá trình thi:
class SpecSharpExampleClass
{
private string! _nonNullableExampleField;
public SpecSharpExampleClass(string s)
: _nonNullableExampleField(s)
{
}
}
Nói cách khác, bạn phải khởi tạo các trường trong giống như cách bạn gọi với các nhà thầu khác base
hoặc this
- trừ khi tất nhiên bạn khởi tạo chúng trực tiếp bên cạnh khai báo trường.
có thể trùng lặp [Giải thích tốt nhất cho các ngôn ngữ không có giá trị rỗng] (http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null) – nawfal