2010-04-23 35 views
15

Tôi tự hỏi những gì ? có nghĩa là trong C#?
Tôi nhìn thấy những thứ như: DateTime? hoặc int?. Tôi cho rằng điều này là cụ thể cho C# 4.0?
Tôi không thể tìm kiếm trong Google vì tôi không biết tên của điều này.
Vấn đề là tôi đang sử dụng DateTime và tôi có nhiều lỗi truyền (từ DateTime đến DateTime?).C# - Câu hỏi cơ bản: '?' Là gì?

Cảm ơn bạn

+9

Đó không phải là mới; được xung quanh kể từ .NET 2.0. – Randolpho

+0

Không được nhầm lẫn với toán tử C nếu-thì-else truyền thống, x <0? "-": "+" – Qwertie

Trả lời

33

Đó là một cách viết tắt để viết Nullable<int> hoặc Nullable<DateTime>. Nullables được sử dụng với value types không thể rỗng (chúng luôn có giá trị).

Nó không dành riêng cho C# 4 bằng cách này.

Bạn chỉ có thể gán một int? một int nếu nó có một giá trị, do đó, mã của bạn sẽ phải làm những việc như:

int? n = 1; 
int i = n ?? default(int); //or whatever makes sense 

Cũng lưu ý rằng một Nullable có hai thuộc tính, HasValueValue mà bạn có thể sử dụng kiểm tra nếu một giá trị đã được đặt và để có được giá trị thực tế.

+3

int i = n ?? mặc định (int); –

+0

@ Grianon Gideon, bạn hoàn toàn đúng, tôi chỉ muốn minh họa rằng một Nullable có hai thuộc tính đó. –

+0

@klausbyskov: Thật tốt khi chỉ ra những thuộc tính đó, nhưng bạn đã cho chúng trong một ví dụ mà chúng là một sự lựa chọn kém - có thể bạn có thể ghi chú chúng một cách riêng biệt và sử dụng '??' để gán cho 'int' . –

12

Nó có nghĩa là số nullable type.

Nó cho phép bạn chỉ định giá trị null cho các loại giá trị như int và DateTime. Nó rất hữu ích với những thứ như các trường tùy chọn trong cơ sở dữ liệu.

5

Nó chỉ định nullable types.

Tôi cho rằng đây là C# cụ thể đối với C# 4.0?

Nó đã được trong C# từ 2,0

5

Các ? là một loại giá trị nullable.

Bạn có thể sử dụng toán tử ?? để trộn nó với các loại giá trị:

const int DefaultValue = -1; 

// get a result that may be an integer, or may be null 
int? myval = GetOptionalIdFromDB(); 

// the value after ?? is used if myval is null 
int nonNullable = myval ?? DefaultValue; 

Các loại nullable có thể được so sánh với null, nên ở trên là viết tắt cho:

if(myval != null) { 
    nonNullable = myval.Value; 
} else { 
    nonNullable = DefaultValue; 
} 

Nhưng tôi thích ??

1

Bí quyết để tìm kiếm: [chỉnh sửa: dường như điều này chỉ xảy ra đôi khi]

// nullable type properties may not initialize as null 
private int? foo; // foo = 0 

// to be certain, tell them to be null 
private int? foo = null; 
+0

Đó không phải là kinh nghiệm của tôi: Bạn có thể đăng một repro đầy đủ với một phương pháp chính và tất cả mọi thứ? Như thế này: lớp tĩnh Chương trình { riêng tĩnh int? tôi; void tĩnh công cộng Main() { Console.WriteLine (i); } } –

+0

Thực ra, bạn nói đúng ... khi tôi làm một bài kiểm tra thẳng trong Trình biên dịch Snippet, nó khởi tạo thành null. Khi tôi đã viết mã trong một mã phía sau trang, truy cập các thuộc tính từ một lớp niêm phong công khai khác, tôi đã nhìn thấy chúng khởi tạo như mặc định kiểu giá trị của chúng. Tôi sẽ phải đào sâu hơn để tìm hiểu khi nào/tại sao điều đó xảy ra. -1 từ chính tôi! – Matt

1

Đó là cách viết tắt khai báo việc triển khai lớp chung Nullable<T>, trong đó T là loại giá trị không thể vô hiệu.

Vì vậy

int? i = null; 

cũng giống như

Nullable<int> i = null; 

Như đã đề cập ở trên Nullable<T> cho thấy nhiều tài sản HasValue vì vậy bạn có thể kiểm tra nếu i có giá trị trước khi làm việc trên đó.

Điều thú vị cần lưu ý: Nếu bạn bỏ Nullable<int> i = 3; vào một đối tượng, bạn có thể truyền trở lại thành số int hoặc Nullable<int> vì nó có giá trị trước khi ra mắt. Tuy nhiên, nếu bạn truyền Nullable<int> i = null; thành một đối tượng, bạn sẽ nhận được NullReferenceException khi truyền trở lại một int nhưng bạn có thể truyền lại thành một số Nullable<int>.

1

Như những người khác đã nói, sau tên của một loại, nó có nghĩa là loại vô hiệu.

? cũng được sử dụng trong toán tử điều kiện.

int max = x > y ? x : y 

này tương đương với:

int max; 
if(x > y) 
{ 
    max = x; 
} 
else 
{ 
    max = y; 
}