thể trùng lặp:
What's the difference between 'int?' and 'int' in C#?Giải thích về int? vs int
Tôi đã đi qua một số mã trong C# khai báo một biến như: int? number
nào ?
nghĩa là gì và như thế nào điều này khác với: int
thể trùng lặp:
What's the difference between 'int?' and 'int' in C#?Giải thích về int? vs int
Tôi đã đi qua một số mã trong C# khai báo một biến như: int? number
nào ?
nghĩa là gì và như thế nào điều này khác với: int
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
.
Đó 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ị.
Bạn cũng có thể sử dụng giá trị 'value == null' thay cho' HasValue'. –
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.
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, HasValue
và Value
, 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.
int? có thể được null, nơi int không thể.
Reference Nullable loại: http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=VS.100).aspx
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;
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 ... –
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. –
Bạn không thể đặt int? null, nhưng bạn có thể gán null cho nó :) –