57 votes

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

Une récente question s'est posée à propos de l'aide de la Chaîne.Format(). Une partie de ma réponse, il était proposé d'utiliser StringBuilder.AppendLine(chaîne de caractères.Format(...)). Jon Skeet avancé que c'était un mauvais exemple, qui a proposé d'utiliser une combinaison de AppendLine et AppendFormat.

Il m'est apparu que je n'ai jamais vraiment m'installer dans un "préféré" pour l'utilisation de ces méthodes. Je pense que je pourrais commencer à utiliser quelque chose comme ce qui suit, mais je suis intéressé de savoir ce que d'autres personnes s'en servir 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"));

61voto

Jon Skeet Points 692016

Je considère AppendFormat suivi de AppendLine comme étant non seulement plus lisible, mais également plus performant que d’appeler AppendLine(string.Format(...)) .

Ce dernier crée une nouvelle chaîne, puis l'ajoute en gros au constructeur existant. Je ne vais pas aller jusqu'à dire "Pourquoi se donner la peine d'utiliser StringBuilder, alors?" mais cela semble un peu contraire à l'esprit de StringBuilder.

13voto

docmanhattan Points 1235

Il suffit de créer 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 souffrent pas autant de frais généraux comme AppendLine(string.Format(...)), comme indiqué ci-dessus.
  • M'empêche d'oublier d'ajouter l' .AppendLine() à la fin (qui arrive assez souvent).
  • Est plus lisible (mais qui est plus une opinion).

Si vous n'aimez pas qu'il soit appelé "AppendLine," on peut changer en "AppendFormattedLine" ou ce que vous voulez. J'ai profiter de tout ce que la queue avec d'autres appels à 'AppendLine" si:

var builder = new StringBuilder();

builder
    .AppendLine("This is a test.")
    .AppendLine("This is a {0}.", "test");

Il suffit d'ajouter un de ces pour chaque surcharge de l'utilisation de la AppendFormat méthode sur StringBuilder.

11voto

AdamSane Points 1825

String.format crée un objet StringBuilder en interne. En faisant

 sbuilder.AppendLine( String.Format( "{0} line", "First"));
 

une instance supplémentaire de constructeur de chaînes, avec tout son overhead, 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();
}
 

2voto

Chris Points 733

Si la performance est importante, essayez d'éviter de AppendFormat() complètement. L'utilisation de plusieurs Append() ou AppendLine() appelle à la place. Cela rend votre code plus grandes et moins lisible, mais il est plus rapide car pas de traitement de chaîne doit être fait. Le traitement de chaîne est plus lent que vous pourriez imaginer.

Je l'utilise généralement:

sbuilder.AppendFormat("{0} line", "First");
sbuilder.AppendLine();
sbuilder.AppendFormat("{0} line", "Second");
sbuilder.AppendLine();

À moins que le rendement est essentiel, dans ce cas j'utilise:

sbuilder.Append("First");
sbuilder.AppendLine(" line");
sbuilder.Append("Second");
sbuilder.AppendLine(" line");

(Bien sûr, cela aurait plus de sens si la "Première" et "Deuxième" où les littéraux de chaîne)

0voto

Brian Genisio Points 30777

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X