Điều gì được thay đổi bằng cách áp dụng Toán tử có giá trị trên kiểu dữ liệu kiểu giá trị mà bây giờ nó có thể lưu trữ null.? (nullable) nhà điều hành trong C#
Trả lời
Như những người khác đã nói, "?" chỉ là viết tắt để thay đổi nó thành Nullable<T>
. Đây chỉ là một loại giá trị khác với cờ Boolean để nói có hay không có giá trị thực sự hữu ích, hoặc là giá trị null cho loại đó. Nói cách khác, Nullable<T>
trông hơi như thế này:
public struct Nullable<T>
{
private readonly bool hasValue;
public bool HasValue { get { return hasValue; } }
private readonly T value;
public T value
{
get
{
if (!hasValue)
{
throw new InvalidOperationException();
}
return value;
}
}
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
// Calling new Nullable<int>() or whatever will use the
// implicit initialization which leaves value as default(T)
// and hasValue as false.
}
Rõ ràng trong mã thực có nhiều phương pháp (như GetValueOrDefault()
) và các nhà khai thác chuyển đổi, vv Các biên dịch C# thêm nhấc nhà khai thác mà hiệu quả proxy để bản gốc các toán tử cho T
.
Khi có nguy cơ nghe như bản ghi bị hỏng, đây vẫn là loại giá trị. Nó không liên quan đến quyền anh ... và khi bạn viết:
int? x = null;
đó không phải là một null tham khảo - đó là giá trị null của Nullable<int>
, ví dụ: một trong những nơi hasValue
là false
.
Khi một loại nullable là đóng hộp, CLR có một tính năng trong đó giá trị hoặc được đóng hộp để một tham chiếu null, hoặc một đồng bằng đóng hộp T. Vì vậy, nếu bạn có mã như thế này:
int? x = 5;
int y = 5;
object o1 = x;
object o2 = y;
Các giá trị được đóng gói được tham chiếu bởi o1
và o2
không thể phân biệt được. Bạn không thể nói rằng một là kết quả của boxing một loại nullable.
Cú pháp ?
là cú pháp đường thành cấu trúc Nullable<T>
.
Thực chất, khi bạn viết int? myNullableInt
, trình biên dịch sẽ đổi thành Nullable<int> myNullableInt
.
Từ MSDN (di chuyển xuống "Các loại Nullable Tổng quan"):
Cú pháp T? là viết tắt của Nullable, trong đó T là một loại giá trị. Hai hình thức có thể hoán đổi cho nhau.
Theo thuật ngữ cơ bản, loại có thể vô hiệu là phiên bản được đóng gói của loại thông thường có trường boolean bổ sung có tên hasValue trên đó. Khi trường này được đặt thành false, trường hợp đó là rỗng.
Kiểm tra câu trả lời này để xem chi tiết hơn một chút về việc thực hiện CLR, và tại sao họ có thể đã chọn nó: Boxing/Unboxing Nullable Types - Why this implementation?
Không, nó không phải là một phiên bản đóng hộp ở tất cả. Nó vẫn là một loại giá trị. –
Tôi sẽ không gọi nó là phiên bản đóng hộp. Boxing tạo ra một biểu diễn kiểu tham chiếu của một kiểu giá trị. Nullable
Các loại thay đổi so với những gì nó đã từng là một loại Nullable.
Nếu bạn đã có một int, và quyết định để làm cho nó một int ?:
int myInt;
Và bạn thực hiện nó:
int? myInt;
nó bây giờ là:
Nullable<int> myInt;
Trong thực tế.
Không có gì thay đổi trên chính loại giá trị, nó chỉ đơn giản là được bọc trong cấu trúc System.Nullable<T>
. http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
- 1. Các + = điều hành với các loại nullable trong C#
- 2. Sử dụng: nhà điều hành trong C
- 3. Modulo nhà điều hành trong Objective C
- 4. Hành vi của nhà điều hành sizeof trong C
- 5. Nhà điều hành lambda C# learning
- 6. Số học C++ nếu nhà điều hành
- 7. Nhà điều hành bí mật C++
- 8. quá tải nhà điều hành C++
- 9. Từ khóa nhà điều hành C++
- 10. R% trong% nhà điều hành
- 11. Nhà điều hành >> làm gì trong C#?
- 12. C# "là" nhà điều hành thay thế trong Java
- 13. tuyên bố trở lại trong ternary nhà điều hành C++
- 14. mũi tên nhà điều hành trong Objective-C
- 15. Javascript || nhà điều hành
- 16. Nhà điều hành Scala @
- 17. Nhà điều hành Groovy ==
- 18. : nhà điều hành (của Elvis điều hành ') trong PHP
- 19. Nhà điều hành Oracle "(+)"
- 20. Groovy *. Nhà điều hành
- 21. nhà điều hành groovy^
- 22. VB.NET: = Nhà điều hành
- 23. Nhà điều hành Javascript! ==
- 24. Nhà điều hành ngầm?
- 25. Nhà điều hành XOR chậm
- 26. SQL Server * = Nhà điều hành?
- 27. || nhà điều hành làm gì?
- 28. Nhà điều hành "==" Javascript nằm
- 29. ống (|) nhà điều hành trong Java
- 30. Quá tải nhà điều hành trong Clojure
cảm ơn bạn rất nhiều. –