web-dev-qa-db-fra.com

Quand utilisez-vous StringBuilder.AppendLine / string.Format contre StringBuilder.AppendFormat?

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"));
57
Neil Barnwell

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.

61
Jon Skeet

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:

  • Ne subit pas autant de frais généraux que AppendLine(string.Format(...)), comme indiqué ci-dessus.
  • M'empêche d'oublier d'ajouter la partie .AppendLine() à la fin (arrive assez fréquemment).
  • Est plus lisible (mais c'est plus une opinion).

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.

13
docmanhattan

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();
}
11
AdamSane

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)

2
Chris

AppendFormat () est beaucoup plus lisible que AppendLine (String.Format ())

0
Brian Genisio

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.

0
Joel Coehoorn

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.

0
Coderer