2013-06-19 55 views
1

我試圖建立一個如下所示的字符串,我注意到它在使用?無論前一個值是否爲空,都是如此。與空合併運算符的字符串連接

"Some Text" + System.Environment.NewLine + 
varOne.ToString() ?? string.Empty + System.Environment.NewLine + 
varTwo.ToString()... 

所有的字符串包含(不管值)達到的Varone(某些文本換行+ +的Varone),除非我刪除?運營商。看了一下後,我發現這不是這樣做的首選方式,我應該使用一個stringbuilder來代替,但我只是好奇爲什麼發生這種情況?

+0

如果變量'null',調用'ToString'它會拋出。 – Oded

+3

框架中沒有從'ToString'返回'null'的類,我懷疑這樣做是個好主意。所以'ToString'之後的空合併運算符沒有意義。也許這個:'varOne == null? string.Empty + System.Environment.NewLine:varOne.ToString()' –

+0

也許一些額外的括號可能會有所幫助。 '''優先級低於'+'。看看這個:http://msdn.microsoft.com/en-us/library/6a71f45d.aspx – spender

回答

6

看一看?? Operator (C# Reference)

的?運算符稱爲空合併運算符,用於爲可爲空的值類型或引用類型定義默認值。它 返回左操作數,如果操作數不爲空;否則它會返回右操作數。

這意味着,??之後的東西只會被分配,如果之前的東西是空的。

所以

 string sNull = null; 
     string s = sNull ?? "TADA"; 

sTADA

 string sNull = null; 
     string s = sNull ?? "TADA"; 
     string sNormal = s ?? "NOT TADA"; 

sNormal也將是TADA

+0

謝謝你 – aw04

2

嘗試:

"Some Text" + System.Environment.NewLine + 
(varOne == null ? string.Empty : varOne.ToString()) + System.Environment.NewLine + 
varTwo.ToString()... 
+2

如果'varOne'爲'null',這會拋出... – Oded

+0

@Ond Duh,你說得對。修正了,謝謝! –

+0

@ X.L.Ant很好的解決方案,謝謝。唯一的原因我沒有標記爲答案是我想明白爲什麼它不起作用,不只是代碼來解決它:) – aw04

1

varOne.ToString()從未null。而假設我們有a ?? b + c + d ?? n,如果a != null整個事情eveluates到a而不是a + (d ?? n)(因爲運營商優先級)

1

的?操作符表示「如果該操作符之前的東西不是空的,則使用它,否則使用該操作符之後的東西」。

你可能會感到困惑的是什麼構成「這個運營商之前的事情」。在你的情況下,這是整個:

"Some Text" + System.Environment.NewLine + varOne.ToString() 

這永遠不會是空的。即使varOne.ToString()返回null(這將是varOne類中的一個錯誤,因爲ToString()不應該返回null),所以將字符串與null連接的結果是原始字符串。絕對沒有上述情況可能導致無效的情況。

現在,varOne可能爲空,在這種情況下,您會收到異常。這可能是你認爲你所反對的,但事實並非如此。如果這真的是你想要的,你需要這樣的事:

"Some Text" + System.Environment.NewLine + 
(varOne != null ? varOne.ToString() : string.Empty) + System.Environment.NewLine + 
varTwo.ToString()... 

這將檢查的Varone不爲空,使用varOne.ToString如果不是,將回退到的String.Empty,如果它是。

請注意,我避免了這種編碼風格與使用StringBuilder的問題,因爲這實際上並不是問題的一部分。

+0

這正是我誤解,謝謝 – aw04

0

現在的答案已經改變。你可以:

"Some Text" + System.Environment.NewLine + 
// no need to coalesce because concatenating nulls are ignored 
varOne?.ToString() 
System.Environment.NewLine + varTwo.ToString() 

甚至

$"Some Text{System.Environment.NewLine}{varOne}{System.Environment.NewLine}{varTwo}" 
// If you're not writing to a system-dependent file, \r\n will also work fine: 
$"Some Text\r\n{varOne}\r\n{varTwo}"