Une récente question posée sur l'utilisation de String.Format (). Une partie de ma réponse comprenait une suggestion d'utiliser StringBuilder.AppendLine (string.Format (...)). Jon Skeet a suggéré que c'était un mauvais exemple et a proposé d'utiliser une combinaison d'AppendLine et AppendFormat.
Il m'est venu à l'esprit que je ne me suis jamais vraiment installé dans une approche "préférée" pour utiliser ces méthodes. Je pense que je pourrais commencer à utiliser quelque chose comme ce qui suit, mais je suis curieux de savoir ce que les autres utilisent comme "meilleure pratique":
sbuilder.AppendFormat("{0} line", "First").AppendLine();
sbuilder.AppendFormat("{0} line", "Second").AppendLine();
// as opposed to:
sbuilder.AppendLine( String.Format( "{0} line", "First"));
sbuilder.AppendLine( String.Format( "{0} line", "Second"));
Je vois AppendFormat
suivi de AppendLine
non seulement plus lisible, mais aussi plus performant que d'appeler AppendLine(string.Format(...))
.
Ce dernier crée une toute nouvelle chaîne, puis l'ajoute en gros dans le générateur existant. Je ne vais pas aller jusqu'à dire "Pourquoi s'embêter à utiliser StringBuilder alors?" mais cela semble un peu contraire à l'esprit de StringBuilder.
Créez simplement une méthode d'extension.
public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args)
{
builder.AppendFormat(format, args).AppendLine();
return builder;
}
Raisons pour lesquelles je préfère ceci:
AppendLine(string.Format(...))
, comme indiqué ci-dessus..AppendLine()
à la fin (arrive assez fréquemment).Si vous n'aimez pas qu'il s'appelle "AppendLine", vous pouvez le changer en "AppendFormattedLine" ou tout ce que vous voulez. J'apprécie tout ce qui s'aligne avec d'autres appels à "AppendLine":
var builder = new StringBuilder();
builder
.AppendLine("This is a test.")
.AppendLine("This is a {0}.", "test");
Ajoutez-en simplement un pour chaque surcharge que vous utilisez de la méthode AppendFormat sur StringBuilder.
String.format crée un objet StringBuilder en interne. En faisant
sbuilder.AppendLine( String.Format( "{0} line", "First"));
une instance supplémentaire de générateur de chaînes, avec tous ses frais généraux est créée.
Réflecteur sur mscorlib, Commonlauageruntimelibary, System.String.Format
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
builder.AppendFormat(provider, format, args);
return builder.ToString();
}
Si les performances sont importantes, essayez d'éviter complètement AppendFormat (). Utilisez à la place plusieurs appels Append () ou AppendLine (). Cela rend votre code plus grand et moins lisible, mais c'est plus rapide car aucune analyse de chaîne ne doit être effectuée. L'analyse des chaînes est plus lente que vous ne l'imaginez.
J'utilise généralement:
sbuilder.AppendFormat("{0} line", "First");
sbuilder.AppendLine();
sbuilder.AppendFormat("{0} line", "Second");
sbuilder.AppendLine();
Sauf si les performances sont critiques, auquel cas j'utiliserais:
sbuilder.Append("First");
sbuilder.AppendLine(" line");
sbuilder.Append("Second");
sbuilder.AppendLine(" line");
(Bien sûr, cela aurait plus de sens si "First" et "Second" n'étaient pas des chaînes littérales)
AppendFormat () est beaucoup plus lisible que AppendLine (String.Format ())
Je préfère cette structure:
sbuilder.AppendFormat("{0} line\n", "First");
Certes, il y a quelque chose à dire pour séparer les sauts de ligne.
Est-il simplement horrible d'utiliser simplement
sbuilder.AppendFormat("{0} line\n", first);
? Je veux dire, je sais que ce n'est pas indépendant de la plate-forme ou quoi que ce soit, mais dans 9 cas sur 10, cela fait le travail.