La concaténation : Qu'est ce que c'est ?
Concaténer, c'est mettre bout à bout quelque chose, en programmation, on concatène des mots, des string comme ceci:
string maValeur = "Ma Valeur 1";
maValeur = maValeur + ", Ma Valeur 2";
maValeur = maValeur + ", Ma Valeur 3";
//Ce qui donne:
//Ma Valeur 1,Ma Valeur 2,Ma Valeur 3
Alors c'est très bien quand on a juste une toute petite concaténation, mais quand on fais une boucle comme ceci:
string maValeur = null;
//Une boucle de 100.000 concaténations
for(int i=0; i < 100000; i++)
{
maValeur = maValeur + ",Ma Valeur " + i;
}
20 secondes et 768 Millisecondes ! (00:20.768) A EVITER ! Les performances ne sont pas du tout optimales !
Pourquoi ?
En utilisant ce genre de concaténation avec des string, à chaque fois vous alloué de l'espace mémoire pour chaque string ajouté, et en plus si vous désirez modifier ou manipuler cette variable, c'est vraiment pas performant du tout ! Microsoft sachant cela à inventer le StringBuilder ! String et Builder pour construction de string.
Le StringBuilder
L'objet StringBuilder s'utilise très simplement:
StringBuilder maValeur = new StringBuilder();
//Une boucle de 100.000 concatènations
for(int i=0; i < 1000000; i++)
{
maValeur.Append("Ma Valeur ").Append(i).Append(",");
}
Et Paf ! 6 Millisecondes ! (00:00.006)
Comme vous pouvez le remarquer, l'objet StringBuilder fait la même chose mais 1000 fois plus rapide et sans prendre trop de mémoire ! Il suffit d'utiliser la méthode Append.
De plus le StringBuilder permet de manipuler le string comme vous le voulez:
Méthode | Description |
---|---|
StringBuilder.Append | Concatène un élément string à la fin de la valeur déjà contenue dans le StringBuilder |
StringBuilder.AppendFormat | Concatène un élément string à la fin de la valeur déjà contenue dans le StringBuilder mais en y ajoutant la possibilité de le formater avec les indices {x} |
StringBuilder.Insert(start, "Valeur") | Ajoute un élément string à une position précise de la valeur déjà contenue dans le StringBuilder |
StringBuilder.Remove(start, longueur) | Enlève un nombre de caractère dans la valeur déjà contenue du StringBuilder d'une position précise jusqu'une certaine longueur. |
AppendFormat
Vous pouvez utilisez le StringBuilder de la même façon que vous utilisez le string.Format(), comme ceci:
StringBuilder maValeur = new StringBuilder();
int maLigne = 1000;
for(int i=0; i < 1000; i++)
{
maValeur.AppendFormat("Ma Valeur {0} est la valeur de la ligne {1},", i, maLigne);
maLigne++;
}
Vous passez à l'indice 0 -> i et à l'indice 1 -> maLigne
Insert
Pour insérer précisément un autre string dans le StringBuilder, rien de plus facile:
StringBuilder maValeur = new StringBuilder();
maValeur.Append("Mon chien se promène dans le jardin.");
maValeur.Insert(10,"et ma chatte ");
maValeur.Insert(33,"nt");
//Résultat: Mon chien et ma chatte se promènent dans le jardin.
Remove
Pour enlever des caractères, toujours aussi simple:
StringBuilder maValeur = new StringBuilder();
maValeur.Append("Mon chien se promène dans le jardin.");
maValeur.Insert(10,"et ma chatte ");
maValeur.Insert(33,"nt");
maValeur.Remove(35, 15);
//Résultat: Mon chien et ma chatte se promènent.
Habituez vous à utiliser le StringBuilder plutôt que des concaténations de string, vous y gagnerez en performance, croyez-moi !
De plus cela a été approuvé par Chuck Norris: