2010-03-15 28 views
121

tôi nhìn thấy ở khắp mọi nơi công trình xây dựng như:ToString Nullable()

int? myVar = null; 
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty; 

Tại sao không sử dụng đơn giản:

string test = myVar.ToString(); 

Mà không phải là giống hệt nhau? Ít nhất Reflector nói rằng:

public override string ToString() 
{ 
    if (!this.HasValue) 
    { 
    return ""; 
    } 
    return this.value.ToString(); 
} 

Vì vậy, đó là chính xác (phiên bản ngắn) hay tôi thiếu cái gì?

+0

Tôi chưa thấy mã như thế này :) – mayu

Trả lời

97

Bạn là khá chính xác. Cũng trong this question, giải pháp cũ được đề xuất trong khi không ai thực sự nhận thấy ToString() đã đưa ra câu trả lời đúng.

Có lẽ lập luận cho các giải pháp tiết hơn là dễ đọc: Khi bạn gọi ToString() vào cái gì đó là phảinull, bạn thường mong đợi một NullReferenceException, mặc dù ở đây nó không được ném.

+17

Trên thực tế, ít nhất hai người nhận thấy: Eric Lippert và Johannes Rössel. –

+7

Trong khi tôi chắc chắn đó không phải là những gì bạn có nghĩa là, tham chiếu không thực sự là null ở đây. Nullable là một loại giá trị. Đây là lý do tại sao gọi 'ToString()' hoạt động mà không có bất kỳ 'NullReferenceException' nào được ném ra. – Thorarin

14

Tôi nghĩ rằng nhiều người có kiểm tra như vậy bởi vì nó không phải là một hành vi tự nhiên của một đối tượng có thể giữ giá trị null.

+0

@Andrew, đã đồng ý, bởi vì mọi người (như tôi) nghĩ lúc đầu rằng nó sẽ ném một ngoại lệ. –

+0

Tôi không biết đây là hành vi. Tôi chắc chắn sẽ nghĩ rằng bất kỳ cấu trúc nào trả về true cho (x == null) cũng sẽ ném một NullReferenceException nếu bạn gọi x.ToString(). –

3

có thể chỉ là theo mẫu? hoặc họ không biết phụ trợ. bạn đúng mã là chính xác giống nhau. thậm chí bạn có thể làm:

int? i = null; 
i.ToString(); //No NullReferenceException 
+0

Bạn có thể cần phải thực hiện các tuyến đường dài nếu ToString() cần phải được văn hóa bất biến, như nullables không có nó trong trình đơn của họ. –

5

Không, bạn đúng, phiên bản ngắn hơn giống như những gì người khác đã làm trong lĩnh vực đó. Các cấu trúc khác tôi có xu hướng sử dụng rất nhiều thay vì ternary với nullables là toán tử kết hợp null. mà cũng bảo vệ bạn khỏi null. Đối với ToString() nó không cần thiết (như bạn chỉ ra) nhưng đối với giá trị int mặc định (ví dụ) nó hoạt động độc đáo, ví dụ:

int page = currentPage ?? 1; 

cho phép bạn làm tất cả các hoạt động nguyên trên trang w/o đầu tiên một cách rõ ràng null kiểm tra và gọi cho các giá trị trong currentPage (nơi currentPage là một int? có lẽ thông qua như một param)

5

Tôi biết, lâu sau khi nó có liên quan, nhưng ... Tôi nghi ngờ đó là bởi vì đối với các kiểu nullable như int? phương thức .ToString() không cho phép bạn sử dụng các chuỗi định dạng. Xem How can I format a nullable DateTime with ToString()?. Có lẽ trong mã ban đầu, có một chuỗi định dạng trong. ToString(), hoặc có lẽ coder đã quên rằng. ToString() không có chuỗi định dạng vẫn có sẵn trên các kiểu nullable.