2011-06-17 71 views

Trả lời

16

int không thể là null.

int? là bí danh cho cấu trúc Nullable<int>, bạn có thể đặt thành null.

+7

Lưu ý rằng 'int?' Là * cũng * một loại giá trị mặc dù ... mâu thuẫn với "theo định nghĩa" của câu đầu tiên của bạn ... –

+0

Tôi vẫn không đồng ý với câu đầu tiên của bạn, vì 'int? 'Là một kiểu giá trị với giá trị null. Sau đó bạn nói về một "đối tượng" là null - trong khi một đối tượng * không bao giờ rỗng, chỉ một tham chiếu là ... và giá trị kiểu giá trị không phải là một đối tượng nào. –

+0

Bạn không thể đặt int? null, nhưng bạn có thể gán null cho nó :) –

4

Đó là cú pháp đường biên dịch cho Nullable<int>

Về cơ bản, số của bạn (hoặc bất kỳ loại giá trị nào khác) có thể là null cũng như giá trị của nó. Bạn kiểm tra giá trị bằng cách sử dụng thuộc tính HasValue. Chúng có thể được đúc thành các loại giá trị của chúng (mặc dù điều này sẽ thất bại nếu chúng không có giá trị) hoặc bạn có thể sử dụng thuộc tính Value (một lần nữa nó sẽ ném một ngoại lệ nếu nó là null)

Một điều thường bị bỏ qua khi sử dụng các kiểu nullable là phương thức GetValueOrDefault() trả về giá trị mặc định (T) nếu đối tượng là null.

Khi @Kyle Trauberman chỉ ra trong nhận xét bạn thực sự có thể so sánh nó với giá trị thay vì kiểm tra HasValue. Loại chính nó là một loại giá trị với các phương thức bình đẳng overriden để nhiều như nó sẽ không bao giờ được null chính nó sẽ trở lại đúng khi so sánh với null nếu nó không có một giá trị.

+0

Bạn cũng có thể sử dụng giá trị 'value == null' thay cho' HasValue'. –

3

Dấu chấm hỏi phía sau khai báo có nghĩa là biến là không thể thực hiện được.

5

int? là viết tắt của Nullable<int> cho phép bạn giả vờ rằng một số nguyên có thể xử lý các giá trị rỗng.

int? foo = null; 

Điều này rất hữu ích cho việc thiếu giá trị trước đây bạn đã sử dụng giá trị ma thuật (-1) trong quá khứ và cũng hữu ích khi xử lý các cột cơ sở dữ liệu.

Đối với một quasi-cái nhìn sâu sắc, một Nullable<T> (giới thiệu trong .NET 2.0) chỉ đơn giản là một wrapper qua một loại giá trị T đó cho thấy nhiều hai thuộc tính, HasValueValue, nơi HasValue là một boolean cho biết nếu giá trị đã được thiết lập và Value (rõ ràng là đủ) trả về giá trị. Đã xảy ra lỗi khi truy cập Value nếu HasValue là sai. Do đó, để truy cập Value, đây là hình thức tốt để kiểm tra HasValue trước tiên. Ngoài ra, nếu bạn chỉ muốn bình thường hóa bất kỳ giá trị không giá trị nào thành giá trị mặc định (0 cho kiểu số), bạn có thể sử dụng phương thức GetValueOrDefault() mà không cần kiểm tra HasValue.

Lưu ý rằng mặc dù bạn dường như đặt foo thành null, nhưng không phải là thực tế là null trong các trường hợp sử dụng bình thường. null đơn giản là đường cú pháp bổ sung cho loại này.Dòng mã trên được dịch thành

Nullable<int> foo = new Nullable<int>(); 

Khởi tạo biến theo cách này chỉ cần đặt thuộc tính HasValue thành false.

Tuy nhiên, trong các trường hợp liên quan đến quyền anh, giá trị sẽ thực sự bị vô hiệu nếu HasValue là sai (nếu không thì hộp sẽ là T). Hãy nhận biết về hậu quả! Ví dụ: in:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty 
Type type = foo.GetType(); // blows up! GetType causes the value to box 
          // resulting in a NullReferenceException 

Đó là khóa học cấp tốc nhanh. Để biết thêm, hãy truy cập vào documentation.

10

int? là một cách viết tắt để tạo một thể hiện của các generic System.Nullable<T> kiểu cấu trúc. Nó cho phép bạn biến biến của bạn thành nullable. Hãy nhớ rằng, vì cú pháp <ValueType>? là viết tắt, bạn có thể khai báo các biến của mình như vậy:

Nullable<int> i = 10;