Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
C# 10 ajoute la prise en charge d’une meilleure interpolation de chaînes, notamment la possibilité de cibler des « gestionnaires » personnalisés en plus des chaînes. StringBuilder en tire parti avec de nouvelles surcharges de Append et AppendLine qui acceptent un gestionnaire de chaînes interpolées personnalisé. Les appels existants à ces méthodes peuvent maintenant commencer à être liés aux nouvelles surcharges. En général, le comportement est identique, mais avec des performances améliorées. Par exemple, plutôt que de créer d'abord une chaîne puis de l'ajouter à la suite, les composants individuels de la chaîne interpolée sont ajoutés directement au générateur. Toutefois, cela peut modifier l’ordre d’évaluation des objets utilisés comme éléments de format, ce qui peut se manifester comme une différence de comportement.
Comportement précédent
Dans les versions précédentes, un appel à :
stringBuilder.Append($"{a} {b}");
compilait l’équivalent de :
stringBuilder.Append(string.Format("{0} {1}", a, b));
Cela signifie que a est évalué, puis b est évalué, ensuite une chaîne est créée à partir des résultats de ces évaluations, puis cette chaîne est ajoutée au générateur.
Nouveau comportement
À partir de .NET 6, un appel à :
stringBuilder.Append($"{a} {b}");
compile l’équivalent de :
var handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder);
handler.AppendFormatted(a);
handler.AppendLiteral(" ");
handler.AppendFormatted(b);
stringBuilder.Append(ref handler);
Cela signifie que a est évalué et ajouté au constructeur, puis que b est évalué et ajouté au constructeur.
Si, par exemple, soit a soit b est lui-même le constructeur, comme indiqué dans le code suivant, le nouvel ordre d’évaluation peut entraîner un comportement différent au moment de l’exécution.
stringBuilder.Append($"{a} {stringBuilder}");
Version introduite
6.0 RC 1
Type de changement cassant
Cette modification peut affecter la compatibilité source .
Raison de la modification
Il est courant pour les développeurs de passer des chaînes interpolées à StringBuilder, car il est plus pratique que de fractionner manuellement la chaîne et d’appeler StringBuilder.Append pour chaque partie. Ces nouvelles surcharges permettent d’avoir une syntaxe concise et de conserver la majeure partie des performances de l’exécution des appels individuels.
Action recommandée
Dans la plupart des cas où StringBuilder.Append et StringBuilder.AppendLine sont utilisés, vous ne remarquerez pas de différence fonctionnelle. Si vous trouvez une différence qui s’avère problématique, vous pouvez restaurer le comportement précédent en ajoutant un cast à (string) avant la chaîne interpolée. Par exemple:
stringBuilder.Append((string)$"{a} {b}")
Cela n’est toutefois pas recommandé, sauf s’il est réellement nécessaire pour la compatibilité.