[英]String concatenation with null-coalescing operator
我試圖構建類似以下的字符串,但我注意到使用??后它會被切斷。 運算符,無論先前的值是否為null。
"Some Text" + System.Environment.NewLine +
varOne.ToString() ?? string.Empty + System.Environment.NewLine +
varTwo.ToString()...
除非刪除??,否則字符串包含的所有內容(無論值如何)都取決於varOne(某些文本+換行符+ varOne)。 操作員。 環顧四周后,我發現這不是執行此操作的首選方法,我可能應該使用stringbuilder來代替,但是我只是好奇為什么會發生這種情況?
嘗試:
"Some Text" + System.Environment.NewLine +
(varOne == null ? string.Empty : varOne.ToString()) + System.Environment.NewLine +
varTwo.ToString()...
varOne.ToString()
永遠不會為null
。 假設我們有a ?? b + c + d ?? n
a ?? b + c + d ?? n
a ?? b + c + d ?? n
,如果a != null
則整個對象將變為a
而不是a + (d ?? n)
(由於運算符優先級)
?? 運算符表示“如果此運算符之前的內容不為null,請使用它,否則使用此運算符之后的內容”。
您可能會感到困惑的是什么構成了“此運算符之前的東西”。 就您而言,這就是全部:
"Some Text" + System.Environment.NewLine + varOne.ToString()
那永遠不會為空。 即使varOne.ToString()返回null(這是varOne類中的錯誤,因為ToString()永遠都不會返回null),所以將字符串與null串聯的結果就是原始字符串。 絕對沒有上述情況可能導致null的情況。
現在, varOne可以為null,在這種情況下,您將得到一個異常。 這可能是您認為要防止的,但事實並非如此。 如果這確實是您想要的,則需要這樣的東西:
"Some Text" + System.Environment.NewLine +
(varOne != null ? varOne.ToString() : string.Empty) + System.Environment.NewLine +
varTwo.ToString()...
這將檢查varOne是否不為null,如果不為var,則使用varOne.ToString,如果為,則回退到string.Empty。
請注意,與StringBuilder的使用相比,我避免了整個編碼風格的問題,因為這實際上並不是問題的一部分。
如今,答案已經改變。 你可以:
"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}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.