Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
C# 10 lägger till stöd för bättre stränginterpolation, inklusive möjligheten att rikta in sig på anpassade "hanterare" utöver strängar. StringBuilder drar nytta av detta med nya överlagringar av Append och AppendLine som accepterar en anpassad interpolerad stränghanterare. Befintliga anrop till dessa metoder kan nu börja binda till de nya överbelastningarna. I allmänhet är beteendet identiskt men med bättre prestanda. I stället för att först skapa en sträng och sedan lägga till den, läggs de enskilda komponenterna i den interpolerade strängen direkt till byggaren. Detta kan dock ändra utvärderingsordningen för objekt som används som formatobjekt, vilket kan visas som en skillnad i beteende.
Tidigare beteende
I tidigare versioner anropar du:
stringBuilder.Append($"{a} {b}");
kompileras till motsvarigheten till:
stringBuilder.Append(string.Format("{0} {1}", a, b));
Detta innebär att a utvärderas, sedan b utvärderas, sedan skapas en sträng från resultatet av dessa utvärderingar och sedan läggs strängen till i byggaren.
Nytt beteende
Från och med .NET 6 innebär ett anrop till:
stringBuilder.Append($"{a} {b}");
kompileras till motsvarigheten till:
var handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder);
handler.AppendFormatted(a);
handler.AppendLiteral(" ");
handler.AppendFormatted(b);
stringBuilder.Append(ref handler);
Detta innebär att a utvärderas och läggs till i strängbyggaren och därpå utvärderas b och läggs till i strängbyggaren.
Om till exempel antingen a eller b själv är byggaren, som visas i följande kod, kan den nya utvärderingsordningen resultera i olika beteenden vid körning.
stringBuilder.Append($"{a} {stringBuilder}");
Version lanserad
6.0 RC 1
Typ av brytande ändring
Den här ändringen kan påverka källkompatibilitet.
Orsak till ändring
Det är vanligt att utvecklare skickar interpolerade strängar till StringBuilder, eftersom det är enklare än att dela upp strängen manuellt och anropa StringBuilder.Append för varje del. Dessa nya överlagringar möjliggör en koncis syntax och motsvarar i prestanda nästan det som uppnås genom att göra individuella anrop.
Rekommenderad åtgärd
I de flesta fall där StringBuilder.Append och StringBuilder.AppendLine används ser du ingen funktionell skillnad. Om du hittar en skillnad som visar sig vara problematisk kan du återställa det tidigare beteendet genom att lägga till en typomvandling till (string) innan den interpolerade strängen. Till exempel:
stringBuilder.Append((string)$"{a} {b}")
Detta rekommenderas dock inte om det inte krävs för kompatibilitet.