82 votes

la meilleure façon d'effacer le contenu de .NET StringBuilder

Je voudrais vous demander ce que vous pensez est le meilleur moyen (dure moins / consomme moins de ressources) pour effacer le contenu afin de le réutiliser un StringBuilder. Imaginez le scénario suivant:

StringBuilder sb = new StringBuilder();
foreach(var whatever in whateverlist)
{
  sb.Append("{0}", whatever);
}

//Perform some stuff with sb

//Clear stringbuilder here

//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
  sb.Append("{0}", whatever2);
}

Et lorsque la compensation StringBuilder je pense à deux possibilités:

sb = new StringBuilder();

ou

sb.Length = 0;

Quel est le meilleur moyen de l'effacer, et pourquoi?

Je vous remercie.

EDIT: je ment avec de l'actuel .NET version 3.5.

76voto

Mike Hofer Points 6559

Si vous faites cela .NET 2.0 ou 3.5, écrire une méthode d'extension pour faire comme ceci:

/// <summary>
///     Clears the contents of the string builder.
/// </summary>
/// <param name="value">
///     The <see cref="StringBuilder"/> to clear.
/// </param>
public static void Clear(this StringBuilder value)
{
    value.Length = 0;
    value.Capacity = 0;
}

Ensuite, vous pouvez l'effacer comme ceci:

someStringBuilder.Clear();

Puis, quand 4.0 vient de sortir, vous pouvez troquer votre méthode d'extension en faveur de la version 4.0.

Mise à JOUR: Ce n'est probablement pas une bonne idée de la Capacité de zéro. Qui va garantir les réaffectations lorsque vous ajoutez à la bâtisseur, si vous êtes à la réutilisation de la même instance. Toutefois, la mémoire de l'instance du constructeur n'est pas libéré jusqu'à ce que vous définissez la Capacité à une valeur très faible (1). La valeur par défaut de la propriété de Capacité est de 16 ans. Vous pouvez envisager d'utiliser 16, ou (si c'est moins efficace) réglage de la capacité deux fois:

  • 1 ou zéro pour effacer la mémoire
  • Mis à votre Capacité d'origine de la valeur (qui peut être différente de 16) à restaurer.

32voto

GraemeF Points 6249

Dans .NET 4.0, vous pouvez appeler sb.Clear() mais en version plus ancienne, vous devez définir sb.Length = 0.

L' Clear() méthode a été ajouté .NET 4.0.

16voto

Paul Sonier Points 25528

Créer la nouvelle StringBuilder. L'ancien maintient ressources associées (tampon de longueur maximale, par exemple) qui sont les mieux juste les ordures collectées à l'écart.

12voto

Yuriy Faktorovich Points 33347

De Contenu de la Communauté sur MSDN:

Pour débarrasser efficacement votre stringbuilder sans la détruire utilisation:

 someStringBuilder.length = 0;
 someStringBuilder.capacity = 0;

Ce qui détruit à la fois de son contenu et la redimensionne à zéro. Comme indiqué ci-dessus désactivez la taille peut avoir un impact plus petits des applications.

10voto

Earlz Points 19355

Je pense que vous faites l'optimisation prématurée.

Je serais prêt à parier que cela sb.Length=0; serait le plus rapide pour éviter de créer un autre objet et placer un autre objet de côté pour le GC, éventuellement, de les collecter.

Je pense que la création d'une nouvelle StringBuilder serait le meilleur coup pour soucis de mémoire. et le paramètre sb.Length serait le meilleur coup pour la vitesse de préoccupations..

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