2014-07-11 69 views
1

嗨程序IAM工作目前正在使用,如果,否則解決填充錯誤值的文本框的問題:這是一個很好的使用?運營商?

 if (!string.IsNullOrWhiteSpace(kundInformation.orgnr)) 
      tbxOrgNr.TextBox.Text = kundInformation.orgnr; 
     else 
      tbxOrgNr.TextBox.Text = ""; 

我從來沒有親自使用的?但是,因爲它在應用程序中有數百個類似的代碼行,所以它很難閱讀。難道是更好地使用:

tbxOrgNr.TextBox.Text = kundInformation.orgnr ?? ""; 
+0

你會得到另一個結果。在第一個例子中,如果'kundInformation.orgnr'只包含空格字符,則它們將在空字符串上更改。但在第二種情況下,不會 – idlerboris

+0

@Sivasubramanian:WPF標籤的動機是純WPF解決方案可能是最乾淨的。所以你的編輯是無效的。 – jgauffin

回答

3

??只爲空,不爲空/空白支票。

創建一個擴展方法代替:

public static class StringExtensions 
{ 
    public static string ValueOrEmpty(this string value) 
    { 
     if (!string.IsNullOrWhiteSpace(value)) 
      return value; 
     else 
      return ""; 

    } 
} 

你那麼可以使用這樣的:

tbxOrgNr.TextBox.Text = kundInformation.orgnr.ValueOrEmpty(); 

你當然可以這樣做,也是其他方式產生更可讀的代碼:

public static class TextBoxExtensions 
{ 
    public static void SetTextOrEmpty(this TextBox tb, string value) 
    { 
     if (!string.IsNullOrWhiteSpace(value)) 
      tb.Text = value; 
     else 
      tb.Text = ""; 

    } 
} 

哪給出了更好的作業:

tbxOrgNr.TextBox.SetTextOrEmpty(kundInformation.orgnr); 
+0

+1良好的解決方案,非常可重複使用,我總是喜歡使用以null作爲參數的擴展方法(ab)。 –

+1

謝謝。最好的方式當然是在將數據存儲在數據源中或從數據源中檢索數據之前清理數據。但是,一旦這些空白空間滑落,如果不在數據層中進行清理,則沒有太多選擇。 – jgauffin

+0

非常好,謝謝。 – user3095715

5

號的??合併運算符將只處理了IsNull一半的呼叫到IsNullOrWhiteSpace


現在,你可以做到:

tbxOrgNr.TextBox.Text = (kundInformation.orgnr ?? "").Trim(); 

但是這對Trim()的額外調用,用於可讀性不太好,也許不是你想要做無論如何,如果導致什麼/尾隨空白意義重大。

-1

??是一個空合併運算符,所以下面的代碼兩件是等價

if (kundInformation.orgnr!=null) 
      tbxOrgNr.TextBox.Text = kundInformation.orgnr; 
     else 
      tbxOrgNr.TextBox.Text = ""; 

OR:

tbxOrgNr.TextBox.Text = kundInformation.orgnr ?? ""; 

注意,空抑制僅檢查(或替換使用)爲空,不爲空串。

按照評論進行編輯。同意'null-coalescing'這個術語

+2

null抑制運算符?它不會禁止null。這是一個合併運營商。 – jgauffin

0

是的,但是:這在語義上是不等價的;由於OrWhiteSpace原碼會使" "變成""。你可以寫一個自定義的擴展方法,雖然:

public static string EmptyIfNullOrWhiteSpace(this string s) 
{ 
    return string.IsNullOrWhiteSpace(s) ? "" : s; 
} 

則:

tbxOrgNr.TextBox.Text = kundInformation.orgnr.EmptyIfNullOrWhiteSpace(); 
+0

爲何這個回答得到2反對票?這似乎有點苛刻,因爲這裏沒有任何不正確的地方。 – Sheridan

+4

在OP的情況下,答案應該是「否」。對於沒有**的OP,「只需使用?? - 運算符」僅僅是因爲這些語句不是**在語義上是等價的。 –

+0

你是對的謝里登。這是一個很好的答案,並收到類似的答案upvotes ...讓我們糾正這一點。 –

0

您已經混淆了三元運算符(?)和?運營商。你的榜樣應該使用三元運算來代替:

if (!string.IsNullOrWhiteSpace(kundInformation.orgnr)) 
    tbxOrgNr.TextBox.Text = kundInformation.orgnr; 
else 
    tbxOrgNr.TextBox.Text = ""; 

是一樣的:

tbxOrgNr.TextBox.Text = (!string.IsNullOrWhiteSpace(kundInformation.orgnr) ? 
    kundInformation.orgnr : ""; 

你可以找到更多關於從?: Operator (C# Reference)頁MSDN上的三元運算符。

??操作是不同的,因爲它只檢查null,所以

tbxOrgNr.TextBox.Text = kundInformation.orgnr ?? ""; 

實際上一樣:

if (kundInformation.orgnr == null) tbxOrgNr.TextBox.Text = ""; 
else tbxOrgNr.TextBox.Text = kundInformation.orgnr; 

你可以找到更多關於從該??操作?? Operator (C# Reference) MSDN上的頁面。

2

不,這不是因爲??只檢查null

你也可以使用這樣的:

tbxOrgNr.TextBox.Text = 
    (!string.IsNullOrWhiteSpace(kundInformation.orgnr)) ? kundInformation.orgnr : ""; 

這基本上是一樣的if聲明。