Freigeben über


StringBuilder.Append-Überladungen und Auswertungsreihenfolge

C# 10 bietet unterstützung für eine bessere Zeichenfolgeninterpolation, einschließlich der Möglichkeit, benutzerdefinierte "Handler" zusätzlich zu Zeichenfolgen als Ziel zu verwenden. StringBuilder nutzt dies durch neue Überladungen von Append und AppendLine, die einen benutzerdefinierten interpolierten Zeichenfolgenhandler akzeptieren. Vorhandene Aufrufe dieser Methoden können jetzt mit der Bindung an die neuen Überladungen beginnen. Im Allgemeinen ist das Verhalten identisch, aber mit verbesserter Leistung. Anstatt beispielsweise zuerst eine Zeichenfolge zu erstellen und dann anzufügen, werden die einzelnen Komponenten der interpolierten Zeichenfolge direkt an den Generator angefügt. Dies kann jedoch die Auswertungsreihenfolge von Objekten ändern, die als Formatelemente verwendet werden, was sich als Verhaltensunterschied manifestieren kann.

Vorheriges Verhalten

In früheren Versionen ein Aufruf von:

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

kompiliert auf das Äquivalent von:

stringBuilder.Append(string.Format("{0} {1}", a, b));

Dies bedeutet, dass zunächst a ausgewertet wird, dann b ausgewertet wird, anschließend wird eine Zeichenfolge aus den Ergebnissen dieser Auswertungen erstellt, und schließlich wird diese Zeichenfolge an den Builder angefügt.

Neues Verhalten

Ab .NET 6 ein Aufruf von:

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

kompiliert auf das Äquivalent von:

var handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder);
handler.AppendFormatted(a);
handler.AppendLiteral(" ");
handler.AppendFormatted(b);
stringBuilder.Append(ref handler);

Dies bedeutet, dass a ausgewertet und dem Builder angefügt wird, und dann b ausgewertet und dem Builder angefügt wird.

Wenn beispielsweise entweder a oder b selbst der Builder ist, wie im folgenden Code gezeigt, kann die neue Auswertungsreihenfolge zu einem anderen Verhalten zur Laufzeit führen.

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

Eingeführte Version

6.0 RC 1

Art der einschneidenden Änderung

Diese Änderung kann sich auf die Quellkompatibilität auswirken.

Grund für Änderung

Es ist üblich, dass Entwickler interpolierte Zeichenfolgen StringBuilderan übergeben, da es praktischer ist, als die Zeichenfolge manuell aufzuteilen und für jeden Teil aufzurufen StringBuilder.Append . Diese neuen Überladungen ermöglichen die präzise Syntax und den größten Teil der Leistung der einzelnen Aufrufe.

In den meisten Fällen, in denen StringBuilder.Append und StringBuilder.AppendLine verwendet werden, werden Sie keinen funktionalen Unterschied feststellen. Wenn Ihnen ein problematischer Unterschied auffällt, können Sie das frühere Verhalten wiederherstellen, indem Sie eine Umwandlung in (string) vor die interpolierte Zeichenfolge einfügen. Beispiel:

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

Dies wird jedoch nicht empfohlen, es sei denn, sie ist tatsächlich aus Kompatibilitätsgründen erforderlich.

Betroffene APIs

Siehe auch