2010-07-06 36 views

Trả lời

19

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 hasValuefalse.

Khi một loại nullable đó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 o1o2 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.

+0

cảm ơn bạn rất nhiều. –

5

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.

+2

+1 cho đường, nhưng tôi không nghĩ từ "toán tử" chính xác ở đây. – Kobi

+0

@Kobi - đủ công bằng. Đã cập nhật câu trả lời. – Oded

+0

Tôi cho rằng đó chỉ là cú pháp, xem [answer] (http://stackoverflow.com/a/24738380/1552016). – qqbenq

-3

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?

+0

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ị. –

+2

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 là một cấu trúc. –

1

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ế.