2015-09-22 22 views
6

Tôi có một câu hỏi (có thể) câm về định dạng hiển thị các loại có thể vô hiệu. Tại thời điểm này, khi tôi cần phải chỉ ra rằng một lĩnh vực một loại nullable không thực sự có một giá trị null, tôi mã nó như thế này:Một cách thanh lịch hơn để hiển thị null?

var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A"; 

Hoặc một số biến thể của rằng văn bản cơ bản.

Tôi không nghĩ rằng mình có thể sử dụng toán tử kết hợp - hoặc ít nhất tôi không nghĩ đó là phương pháp phù hợp (đúng với tôi nếu tôi sai).

Có cách nào tốt hơn và hiệu quả hơn để thực hiện việc này không? Tôi chỉ cảm thấy như mã soạn sẵn này đang xâm nhập vào mã nguồn của tôi ngày càng nhiều trong những ngày này ...

+0

Phiên bản C# nào? –

+1

Tại sao không phải là một phương pháp mở rộng chung? –

Trả lời

11

cách tiếp cận của bạn không phải là xấu cho mỗi gia nhập, nhưng bạn là đúng về sự lo lắng của bạn để sao chép mã. Bạn có thể giải quyết vấn đề này bằng cách tạo phương thức phụ trợ, chẳng hạn như:

public static class DecimalExtensions 
{ 
    public static string Display(this decimal? value) 
    { 
     return value.HasValue ? value.ToString(): "N/A"; 
    } 
} 

Trong ví dụ này tôi đã tạo phương pháp mở rộng nhưng phương pháp thông thường cũng sẽ hoạt động tốt. Sau đó, bạn có thể làm chỉ là:

var stringToDisplay = nullableDecimal.Display(); 

... đó là đẹp hơn để đọc và ngăn chặn vô số các "N/A" s trong mã (và như đã nêu trong các ý kiến, cũng giúp giảm bớt refactoring nếu bao giờ cần thiết) .

+2

Tôi chỉ cần gõ một cái gì đó gần như chính xác như nhau, ở bên cộng, nó cho bạn một nơi duy nhất mà bạn phải thay đổi chuỗi "N/A" nếu bạn cần cấu trúc lại nó để nói điều gì đó khác, như "Không" . –

+0

Cảm ơn, Konamiman - Tôi đồng ý đây là con đường để đi. – code4life

+0

Lỗi chính tả: DecimalExtenstions phải là DecimalExtensions. – Polyfun

8

Trong C# 5 hoặc cũ hơn, mã của bạn có thể tốt, mặc dù bạn luôn có thể trích xuất ra phương pháp riêng của nó bạn đã rắc nó khắp nơi.

Cũng xem xét nhồi "N/A" thành hằng số, trong trường hợp bạn muốn thay đổi.

Tuy nhiên, trong C# 6 bạn có thể thay đổi nó một chút, mặc dù nó sẽ không nhận được nhiều tốt hơn:

var stringToDisplay = nullableDecimal?.ToString() ?? "N/A"; 

Nhà điều hành ?. được gọi là các nhà điều hành "null-có điều kiện" và về cơ bản là một đoạn ngắn cú pháp cho biểu thức bạn phải bắt đầu.

Về cơ bản, đó là một phần của biểu thức có nghĩa này:

string temp = nullableDecimal != null ? nullableDecimal.ToString() : null; 

mặc dù các nhà điều hành ?. sẽ chỉ đánh giá phần trước nó một lần, không phải hai lần, vì vậy nó là như thế này:

var operand = nullableDecimal; 
string temp = operand != null ? operand.ToString() : null; 

Không thực sự quan trọng ở đây mặc dù, nhưng nếu nó là một cuộc gọi phương pháp, nó có thể được.

Đối với giải nén nó vào một phương pháp, chỉ cần tạo một phương pháp khuyến nông:

public static class MyNullableDecimalExtensions 
{ 
    public static string ToDisplayText(this decimal? value) 
    { 
     if (decimal.HasValue) 
      return decimal.Value.ToString(); 
     return "N/A"; 
    } 
} 

tôi không quá ngây thơ của các cú pháp ?: điều hành, vì vậy trong một phương pháp như thế này tôi sẽ viết ra đầy đủ nếu thay vào đó.

Sau đó, bạn có thể gọi nó như thế này:

var stringToDisplay = nullableDecimal.ToDisplayText(); 
+0

nếu tôi có thể chấp nhận cả câu trả lời của bạn và của Konamiman, tôi sẽ làm thế! Cảm ơn bạn đã hướng dẫn từ bạn cả hai - Tôi đã sử dụng các phần của cả hai câu trả lời, với nhiều niềm vui. – code4life

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