StringBuilder.Append túlterhelések és kiértékelési sorrend

A C# 10 már támogatja a jobb sztringinterpolációt, ami magában foglalja az egyéni "kezelők" célzásának lehetőségét is a sztringek mellett. StringBuilder új túlterhelésekkel kihasználja ezt, amelyek lehetővé teszik Append és AppendLine számára, hogy egyéni interpolált sztringkezelőt fogadjanak el. Előfordulhat, hogy a metódusok meglévő hívásai most elkezdhetik a kapcsolódást az új túlterhelésekhez. A viselkedés általában azonos, de jobb teljesítménnyel. Például ahelyett, hogy először létrehozunk egy karakterláncot, majd azt adjuk hozzá, az interpolált karakterlánc egyes elemeit közvetlenül az építőhöz fűzzük hozzá. Ez azonban megváltoztathatja a formátumelemként használt objektumok kiértékelési sorrendjét, ami a viselkedésbeli különbségként nyilvánulhat meg.

Előző viselkedés

A korábbi verziókban egy hívás a következőre:

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

fordítása a következőnek felel meg:

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

Ez azt jelenti, hogy először a értékelik ki, majd b értékelik ki, ezután egy sztringet hoznak létre ezen kiértékelések eredményeiből, amit végül hozzáfűznek az összefűzőhöz.

Új viselkedés

A .NET 6-tól kezdve a következő hívásokat kell elindítania:

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

kompilálódik azzal, ami ekvivalens a következővel

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

Ez azt jelenti, hogy a kiértékelik és hozzáfűzik az építőhöz, majd b kiértékelik és hozzáfűzik az építőhöz.

Ha például vagy a, vagy b maga az építő, ahogy az a következő kódban látható, az új kiértékelési sorrend futásidőben eltérő viselkedést eredményezhet.

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

Bevezetett verzió

6.0 RC 1

A kompatibilitástörő változás típusa

Ez a módosítás hatással lehet a forráskompatibilitásra.

A változás oka

Gyakran előfordul, hogy a fejlesztők interpolált sztringeket adnak át StringBuilder, mivel ez kényelmesebb, mint manuálisan felosztani a sztringet, és meghívni StringBuilder.Append az egyes részekhez. Ezek az új túlterhelések lehetővé teszik az egyes hívások tömör szintaxisát és a teljesítményük nagy részét.

A legtöbb esetben, ahol StringBuilder.Append és StringBuilder.AppendLine van használva, nem fog funkcionális különbséget észlelni. Ha olyan különbséget talál, amely problémásnak bizonyul, visszaállíthatja a viselkedést az előző állapotra úgy, hogy hozzáad egy típuskonverziót a (string) előtt az interpolált sztringhez. Például:

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

Ez azonban nem ajánlott, hacsak nem szükséges a kompatibilitáshoz.

Érintett API-k

Lásd még