2015-03-19 16 views
55

Trong C#, giá trị mặc định của biến thể hiện lớp loại int? là gì?Giá trị mặc định của loại null "int?" Là gì? (bao gồm cả dấu chấm hỏi)?

Ví dụ: trong mã sau, giá trị nào sẽ là MyNullableInt nếu nó không bao giờ được chỉ định rõ ràng?

class MyClass 
{ 
    public int? MyNullableInt; 
} 

(Dường như câu trả lời là gần như chắc chắn một trong hai null hoặc 0, nhưng mà những is it?)

+4

Tại sao downvote? (Câu trả lời cho câu hỏi này ban đầu không rõ ràng với tôi mà không thực sự chạy mã để kiểm tra hành vi; và đáng ngạc nhiên, tôi không thể tìm thấy một câu hỏi trùng lặp trên StackOverflow, hoặc dễ dàng tìm thấy ở nơi khác thông qua Google.) –

+0

Bạn có thể đã xem [ở đây] (https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx) - google hit đầu tiên cho tôi. –

+1

@ 500 - Tôi đã tìm thấy bài báo đó khi tôi đang nghiên cứu - tôi thực sự liên kết với nó trong câu trả lời của riêng tôi bên dưới - nhưng theo như tôi có thể nói, bài viết không nói rõ ràng rằng giá trị mặc định của một kiểu nullable Ví dụ là null. Nó * không * nói "Giá trị mặc định cho HasValue là sai. Giá trị tài sản không có giá trị mặc định", nhưng điều đó không trực tiếp trả lời câu hỏi ban đầu của tôi mà không cần đào thêm. –

Trả lời

80

Giá trị mặc định cho int? - và cho bất kỳ loại nullable mà sử dụng " kiểu?" khai báo - là null.

Tại sao đây là trường hợp:

  • int? là cú pháp đường cho các loại Nullable<T> (trong đó T là int), một cấu trúc. (reference)
  • Loại Nullable<T> có thành viên bool HasValue, mà khi false, làm cho Nullable<T> dụ "hành động như" một giá trị null. Cụ thể, số Nullable<T>.Equals method bị ghi đè để trả lại true khi số Nullable<T> với HasValue == false được so sánh với giá trị thực tế là null.
  • Từ C# Language Specification 11.3.4, giá trị mặc định ban đầu của cá thể struct là tất cả các trường loại giá trị của cấu trúc được đặt thành giá trị mặc định của chúng và tất cả các trường loại tham chiếu của cấu trúc được đặt thành null.
  • Giá trị mặc định của biến số bool trong C# là false (reference). Do đó, thuộc tính HasValue của phiên bản Nullable<T> mặc định là false; mà lần lượt làm cho rằng Nullable<T> trường hợp chính nó hành động như null.
+0

Khi tôi thay đổi một tuyên bố từ 'int? x = null; 'đến' int? x; ', tôi nhận được lỗi trình biên dịch hơn nữa trong mã:" Sử dụng biến cục bộ chưa được gán x ". –

+0

@JohnPick Đó là tính năng trình biên dịch C# nhằm ngăn chặn các lỗi có thể phát sinh từ bạn "quên" để khởi tạo biến trước khi sử dụng nó. Một tình huống mà bạn * có thể * gặp phải một int không được khởi tạo? là khi đó là biến thành viên của lớp. Ví dụ về cả hai ở đây: https://blogs.msdn.microsoft.com/abhinaba/2005/11/08/c-uninitialized-instance-variables/ –

+0

Vì vậy, về cơ bản nơi này là blog công nghệ của bạn? Bạn đặt câu hỏi mà bạn chỉ cần chạy mã để nhận được câu trả lời, sau đó tự trả lời câu hỏi trong cùng một phút. –

0
var x = default (int?); 
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString()); 
12

tôi cảm thấy quan trọng để chia sẻ phương pháp Nullable<T>.GetValueOrDefault() trong đó đặc biệt tiện dụng khi làm việc với tính toán sử dụng Nullable<int> aka int? giá trị. Có nhiều lần bạn không phải kiểm tra tài sản HasValue và bạn chỉ có thể sử dụng GetValueOrDefault() thay thế.

var defaultValueOfNullableInt = default(int?); 
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString()); 

var defaultValueOfInt = default(int); 
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt); 

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault()); 

Command line showing the code above working

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