2013-05-27 73 views
8

Tôi có một số mã C# với khai báo mảng sau. Lưu ý đơn ? sau Color.Cái gì? toán tử có nghĩa là trong C# sau khi khai báo kiểu?

private Color?[,] scratch; 

Trong điều tra của tôi, tôi đã phát hiện ra rằng nếu bạn bạn có mã như:

int? a; 

Biến a không được khởi tạo. Khi nào và ở đâu bạn sẽ sử dụng điều này?

+0

Nếu bạn đang làm một số tính toán toán học dựa trên một đầu vào người sử dụng, bạn sẽ muốn làm chắc chắn rằng họ đã nhập một số để phương trình không sử dụng giá trị mặc định – Sayse

+2

Bạn đã thêm thẻ 'nullable' như thế nào bên cạnh bạn không biết'? 'Có nghĩa là gì? –

+0

Tôi luôn ngạc nhiên khi thấy, khi câu hỏi đơn giản, có rất nhiều câu trả lời trùng lặp. – Nolonar

Trả lời

15

? chỉ là đường cú pháp, có nghĩa là trường này không có khả năng. Nó thực sự là viết tắt của Nullable<T>.

Trong C# và Visual Basic, bạn đánh dấu loại giá trị là rỗng bằng cách sử dụng ? ký hiệu sau loại giá trị. Ví dụ, int? trong C# hoặc Số nguyên? trong Visual Basic tuyên bố một loại giá trị số nguyên có thể được gán null.

Bạn không thể gán null để loại giá trị, int là một loại giá trị không thể giữ null giá trị, int? mặt khác có thể lưu trữ giá trị null.

Tương tự là trường hợp với Color, vì nó là một cấu trúc (như vậy, kiểu giá trị) và nó không thể giữ giá trị null, với Color?[,] bạn đang làm cho một loạt các màu nullable.

Đối với câu hỏi của bạn:

Biến 'a' không được khởi tạo. Khi nào và ở đâu bạn sẽ sử dụng điều này?

Bằng cách sử dụng ? với biến không làm cho nó khởi tạo với null hoặc bất kỳ giá trị khác, nó vẫn là phải được khởi tạo.

int? a = null; 

int b = null;//error since b is not nullable 
+0

Còn trong một tuyên bố. client? .Đóng(); ? – Rahly

+0

Nếu nó chỉ đơn thuần là cú pháp, thì '?' Và 'Nullable ' có thể hoán đổi cho nhau như thế nào? – dakab

+0

@dakab, tại thời gian biên dịch chúng thay đổi, ví dụ, 'int?' Sẽ trở thành 'Nullable ' – Habib

4

Điều đó có nghĩa là loại được xác định là không thể thực hiện được. Hãy xem this link để biết thêm thông tin.

Với nullables bạn có thể làm:

int? i = null; 

Và dĩ nhiên làm kiểm tra null:

if (i == null) 
{ 
    // do stuff here ... 
} 
0

Điều này có nghĩa rằng đối tượng có thể có một -giá trị null ngoài phạm vi bình thường của họ.

Từ MSDN:

loại Nullable là trường hợp của các struct Nullable. Một kiểu nullable có thể đại diện cho phạm vi giá trị chính xác cho kiểu giá trị cơ sở của nó, cộng với một giá trị null bổ sung. Ví dụ, một Nullable, phát âm là "Nullable of Int32," có thể được gán bất kỳ giá trị nào từ -2147483648 đến 2147483647 hoặc nó có thể được gán giá trị null.
...

Ví dụ

class NullableExample 
{ 
    static void Main() 
    { 
     int? num = null; 

     // Is the HasValue property true? 
     if (num.HasValue) 
     { 
      System.Console.WriteLine("num = " + num.Value); 
     } 
     else 
     { 
      System.Console.WriteLine("num = Null"); 
     } 

     // y is set to zero 
     int y = num.GetValueOrDefault(); 

     // num.Value throws an InvalidOperationException if num.HasValue is false 
     try 
     { 
      y = num.Value; 
     } 
     catch (System.InvalidOperationException e) 
     { 
      System.Console.WriteLine(e.Message); 
     } 
    } 
} 
0

Color? đề cập đến một NullableColor và tương đương với Nullable<Color>.

Color c = null;//ERROR Color is a struct, cannot be null! 
Color? c = null;//OK 

Nullable Types

Các vấn đề liên quan