Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
C# 10 voegt ondersteuning toe voor betere tekenreeksinterpolatie, inclusief de mogelijkheid om aangepaste handlers te targeten naast tekenreeksen. StringBuilder profiteert hiervan met nieuwe overbelastingen van Append en AppendLine die een aangepaste geïnterpoleerde tekenreekshandler accepteren. Bestaande aanroepen naar deze methoden kunnen nu beginnen met het binden aan de nieuwe overbelastingen. Over het algemeen is gedrag identiek, maar met verbeterde prestaties. In plaats van bijvoorbeeld eerst een tekenreeks te maken en vervolgens die tekenreeks toe te voegen, worden de afzonderlijke onderdelen van de geïnterpoleerde tekenreeks rechtstreeks aan de opbouwfunctie toegevoegd. Dit kan echter de evaluatievolgorde wijzigen van objecten die worden gebruikt als opmaakitems, die kunnen optreden als een verschil in gedrag.
Vorig gedrag
In eerdere versies werd het volgende aangeroepen:
stringBuilder.Append($"{a} {b}");
gecompileerd naar het equivalent van:
stringBuilder.Append(string.Format("{0} {1}", a, b));
Dit betekent dat a wordt geëvalueerd, b vervolgens wordt er een tekenreeks gemaakt op basis van de resultaten van deze evaluaties en vervolgens wordt die tekenreeks toegevoegd aan de opbouwfunctie.
Nieuw gedrag
Vanaf .NET 6 wordt een oproep gedaan naar:
stringBuilder.Append($"{a} {b}");
compileert naar het equivalent van:
var handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder);
handler.AppendFormatted(a);
handler.AppendLiteral(" ");
handler.AppendFormatted(b);
stringBuilder.Append(ref handler);
Dit betekent dat a wordt geëvalueerd en toegevoegd aan de opbouwfunctie en vervolgens b wordt geëvalueerd en toegevoegd aan de opbouwfunctie.
Als bijvoorbeeld a of b zelf de bouwer is, zoals getoond in de volgende code, kan de nieuwe evaluatievolgorde leiden tot een ander gedrag tijdens de runtime.
stringBuilder.Append($"{a} {stringBuilder}");
Geïntroduceerde versie
6.0 RC 1
Type van brekende verandering
Deze wijziging kan invloed hebben op broncompatibiliteit.
Reden voor wijziging
Het is gebruikelijk dat ontwikkelaars geïnterpoleerde tekenreeksen doorgeven, StringBuilderomdat het handiger is dan de tekenreeks handmatig te splitsen en aan te roepen StringBuilder.Append voor elk onderdeel. Deze nieuwe overbelastingen maken een beknopte syntaxis en de meeste efficiëntie bij het uitvoeren van individuele oproepen mogelijk.
Aanbevolen actie
In de meeste gevallen waar StringBuilder.Append en StringBuilder.AppendLine worden gebruikt, zult u geen functioneel verschil merken. Als u een verschil vindt dat problematisch blijkt te zijn, kunt u het vorige gedrag herstellen door een cast toe te voegen aan (string) vóór de geïnterpoleerde tekenreeks. Voorbeeld:
stringBuilder.Append((string)$"{a} {b}")
Dit wordt echter niet aanbevolen, tenzij dit daadwerkelijk vereist is voor compatibiliteit.