StringBuilder.Append 多載和評估順序
C# 10 新增可以加強字串插補的支援,包括除了字串之外,還能夠以自訂「處理常式」為目標。 StringBuilder 透過 Append 和 AppendLine 的新多載來利用這項支援,接受自訂差補字串處理常式。 這些方法的現有呼叫現在可能會開始繫結至新的多載。 一般而言,行為完全相同,但效能已改善。 例如,不是先建立字串,然後再附加該字串,而是將差補字串的個別元件直接附加至建立器器。 不過,這會變更用作格式項目的物件評估順序,造成行為出現差異。
先前的行為
在舊版中,呼叫:
stringBuilder.Append($"{a} {b}");
已編譯為下列對等命令:
stringBuilder.Append(string.Format("{0} {1}", a, b));
這表示系統會評估 a
,然後評估 b
,接著從這些評估的結果中建立字串,然後將該字串附加至建立器。
新的行為
從 .NET 6 開始,呼叫:
stringBuilder.Append($"{a} {b}");
已編譯為下列對等命令:
var handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder);
handler.AppendFormatted(a);
handler.AppendLiteral(" ");
handler.AppendFormatted(b);
stringBuilder.Append(ref handler);
這表示系統會評估 a
並附加至建立器,然後評估 b
並附加至建立器。
例如,如果 a
或 b
本身是建立器,如下列程式碼所示,則新的評估順序可能會導致執行階段發生不同的行為。
stringBuilder.Append($"{a} {stringBuilder}");
導入的版本
6.0 RC 1
中斷性變更的類型
此變更可能會影響來源相容性。
變更原因
開發人員通常會將差補字串傳遞至 StringBuilder,因為比起手動分割字串後在每個部分呼叫 StringBuilder.Append,這樣做更方便。 這些新的多載可以讓語法變得精簡,而且因為不用執行個別呼叫,效能得以提升。
建議的動作
在使用 StringBuilder.Append 和 StringBuilder.AppendLine 的大部分情況下,您不會注意到功能差異。 如果您發現的差異經證明確實有問題,則可以在差補字串之前新增轉換至 (string)
以還原先前的行為。 例如:
stringBuilder.Append((string)$"{a} {b}")
不過,除非相容性確實有此需要,否則不建議這麼做。
受影響的 API
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應