C# Language Qu'est-ce qu'un StringBuilder et quand l'utiliser


Exemple

Un StringBuilder représente une série de caractères qui, contrairement à une chaîne normale, sont mutables. Souvent, il est nécessaire de modifier les chaînes que nous avons déjà créées, mais l'objet de chaîne standard n'est pas mutable. Cela signifie que chaque fois qu'une chaîne est modifiée, un nouvel objet chaîne doit être créé, copié et réaffecté.

string myString = "Apples";
mystring += " are my favorite fruit";

Dans l'exemple ci-dessus, myString n'a initialement que la valeur "Apples" . Cependant, lorsque nous concaténons `` sont mes fruits préférés '', ce que la classe de chaînes a besoin de faire en interne implique:

  • Créer un nouveau tableau de caractères égal à la longueur de myString et la nouvelle chaîne que nous ajoutons.
  • Copier tous les caractères de myString au début de notre nouveau tableau et copier la nouvelle chaîne à la fin du tableau.
  • Créez un nouvel objet chaîne en mémoire et réaffectez-le à myString .

Pour une seule concaténation, ceci est relativement trivial. Cependant, si nécessaire pour effectuer de nombreuses opérations d'ajout, par exemple en boucle?

String myString = "";
for (int i = 0; i < 10000; i++)
    myString += " "; // puts 10,000 spaces into our string

En raison de la copie répétée et de la création d’objets, les performances de notre programme s’en trouveront considérablement dégradées. Nous pouvons éviter cela en utilisant un StringBuilder .

StringBuilder myStringBuilder = new StringBuilder();    
for (int i = 0; i < 10000; i++)
    myStringBuilder.Append(' ');

Maintenant, lorsque la même boucle est exécutée, les performances et la vitesse d'exécution du programme seront nettement plus rapides que l'utilisation d'une chaîne normale. Pour rendre le StringBuilder dans une chaîne normale, nous pouvons simplement appeler la méthode ToString() de StringBuilder .


Cependant, ce n'est pas la seule optimisation de StringBuilder . Afin d'optimiser davantage les fonctions, nous pouvons tirer parti d'autres propriétés qui contribuent à améliorer les performances.

StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000

Si nous savons à l'avance combien de temps notre StringBuilder doit être, nous pouvons spécifier sa taille à l'avance, ce qui l'empêchera de redimensionner le tableau de caractères interne.

sb.Append('k', 2000);

Bien que l'utilisation de StringBuilder pour l'ajout soit beaucoup plus rapide qu'une chaîne, elle peut s'exécuter encore plus rapidement si vous n'avez besoin d'ajouter qu'un seul caractère plusieurs fois.

Une fois que vous avez terminé la construction de votre chaîne, vous pouvez utiliser la méthode ToString() sur StringBuilder pour la convertir en string base. Cela est souvent nécessaire car la classe StringBuilder n'hérite pas de la string .

Par exemple, voici comment vous pouvez utiliser un StringBuilder pour créer une string :

string RepeatCharacterTimes(char character, int times)
{
    StringBuilder builder = new StringBuilder("");
    for (int counter = 0; counter < times; counter++)
    {
        //Append one instance of the character to the StringBuilder.
        builder.Append(character);
    }
    //Convert the result to string and return it.
    return builder.ToString();
}

En conclusion, StringBuilder devrait être utilisé à la place de string lorsque de nombreuses modifications à une chaîne doivent être effectuées en tenant compte des performances.