簡體   English   中英

使用空合並運算符的字符串連接

[英]String concatenation with null-coalescing operator

我試圖構建類似以下的字符串,但我注意到使用??后它會被切斷。 運算符,無論先前的值是否為null。

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

除非刪除??,否則字符串包含的所有內容(無論值如何)都取決於varOne(某些文本+換行符+ varOne)。 操作員。 環顧四周后,我發現這不是執行此操作的首選方法,我可能應該使用stringbuilder來代替,但是我只是好奇為什么會發生這種情況?

看看?? 運算符(C#參考)

?? 運算符稱為null-coalescing運算符,用於為可為空的值類型或引用類型定義默認值。 如果操作數不為null,則返回左側的操作數;否則,返回0。 否則返回正確的操作數。

這意味着, ??之后的東西?? 僅當之前的內容為null時才分配。

所以

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

sTADA

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

sNormal也將是TADA

嘗試:

"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM