StringBuilder.Append 多載和評估順序

C# 10 新增可以加強字串插補的支援,包括除了字串之外,還能夠以自訂「處理常式」為目標。 StringBuilder 透過 AppendAppendLine 的新多載來利用這項支援,接受自訂差補字串處理常式。 這些方法的現有呼叫現在可能會開始繫結至新的多載。 一般而言,行為完全相同,但效能已改善。 例如,不是先建立字串,然後再附加該字串,而是將差補字串的個別元件直接附加至建立器器。 不過,這會變更用作格式項目的物件評估順序,造成行為出現差異。

先前的行為

在舊版中,呼叫:

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 並附加至建立器。

例如,如果 ab 本身是建立器,如下列程式碼所示,則新的評估順序可能會導致執行階段發生不同的行為。

stringBuilder.Append($"{a} {stringBuilder}");

導入的版本

6.0 RC 1

中斷性變更的類型

此變更可能會影響來源相容性

變更原因

開發人員通常會將差補字串傳遞至 StringBuilder,因為比起手動分割字串後在每個部分呼叫 StringBuilder.Append,這樣做更方便。 這些新的多載可以讓語法變得精簡,而且因為不用執行個別呼叫,效能得以提升。

在使用 StringBuilder.AppendStringBuilder.AppendLine 的大部分情況下,您不會注意到功能差異。 如果您發現的差異經證明確實有問題,則可以在差補字串之前新增轉換至 (string) 以還原先前的行為。 例如:

stringBuilder.Append((string)$"{a} {b}")

不過,除非相容性確實有此需要,否則不建議這麼做。

受影響的 API

另請參閱