Je voudrais connaître la différence entre string
et StringBuilder
et avoir également besoin d'exemples pour comprendre.
Réponses
Trop de publicités?Un string
instance est immuable. Vous ne pouvez pas le changer après qu'il a été créé. Toute opération qui s'affiche pour modifier la chaîne au lieu de cela renvoie une nouvelle instance:
string foo = "Foo";
// returns a new string instance instead of changing the old one
string bar = foo.Replace('o', 'a');
string baz = foo + "bar"; // ditto here
Des objets immuables ont des belles propriétés, telles qu'elles peuvent être utilisées dans les threads sans craindre des problèmes de synchronisation ou que vous pouvez tout simplement la main sur votre privé champs de sauvegarde directement sans craindre que quelqu'un change les objets qu'ils ne devraient pas être en train de changer (voir tableaux ou mutable listes, qui ont souvent besoin d'être copié avant de les retourner si ce n'est pas souhaitée). Mais lorsque utilisés maladroitement, ils peuvent créer de graves problèmes de performances (comme presque n'importe quoi – si vous avez besoin d'un exemple à partir d'une langue qui se targue sur la vitesse d'exécution puis regarder C fonctions de manipulation de chaîne).
Lorsque vous avez besoin d'une mutable chaîne, comme celui que vous êtes contructing la pièce sage ou lorsque vous changez de beaucoup de choses, alors vous aurez besoin d'un StringBuilder
qui est un tampon de caractères qui peut être changé. Cela a, pour la plupart partie, les conséquences de performance. Si vous voulez une mutable chaîne et, au lieu de le faire avec un normal string
de l'instance, alors vous finirez avec la création et la destruction d'un grand nombre d'objets inutilement, alors qu'un StringBuilder
de l'instance elle-même va changer, niant la nécessité pour de nombreux nouveaux objets.
Simple exemple: L'exemple suivant fera de nombreux programmeurs grincer des dents avec douleur:
string s = string.Empty;
for (i = 0; i < 1000; i++) {
s += i.ToString() + " ";
}
Vous finirez par la création de 2001 cordes ici, de 2000 sont jetés. Le même exemple en utilisant StringBuilder:
StringBuilder sb = new StringBuilder();
for (i = 0; i < 1000; i++) {
sb.Append(i);
sb.Append(' ');
}
Cela devrait mettre beaucoup moins de stress sur l'allocateur de mémoire :-)
Il convient de noter, cependant, que le compilateur C# est raisonnablement intelligent quand il s'agit de chaînes de caractères. Par exemple, la ligne suivante
string foo = "abc" + "def" + "efg" + "hij";
sera rejoint par le compilateur, ne laissant qu'une seule chaîne au moment de l'exécution. De même, les lignes telles que
string foo = a + b + c + d + e + f;
sera réécrit pour
string foo = string.Concat(a, b, c, d, e, f);
si vous n'avez pas à payer pour les cinq absurde des enchaînements qui serait naïf façon de gérer ce qui. Cela ne vous sauvera pas en boucle comme ci-dessus (à moins que le compilateur se déroule la boucle, mais je pense que l'équipe peut effectivement le faire et mieux de ne pas parier sur qui).
La chaîne est immuable, ce qui signifie que lorsque vous créez une chaîne, vous ne pouvez jamais la modifier. Elle crée plutôt une nouvelle chaîne pour stocker la nouvelle valeur. Cela peut s'avérer inefficace si vous devez modifier beaucoup la valeur d'une variable de chaîne.
Stringbuilder peut être utilisé pour simuler une chaîne mutable, il est donc utile lorsque vous devez changer beaucoup de chaîne.
Différence majeure:
String est immuable. Cela signifie que vous ne pouvez pas modifier la chaîne à tous, le résultat de la modification est de la nouvelle chaîne. Ce n'est pas efficace si vous prévoyez d'ajouter à la chaîne
StringBuilder est mutable. Il peut être modifié en aucune façon et il ne nécessite pas la création de la nouvelle instance. Lorsque le travail est fait, ToString() peut être appelée pour obtenir la chaîne de caractères.
Les chaînes peuvent participer à un stage, cela signifie que les chaînes de caractères avec le même contenu peut avoir les mêmes adresses. StringBuilder ne peut pas être interné.
La chaîne est la seule classe qui peut avoir de référence littérale.
À partir de la Classe StringBuilder de la documentation:
L'objet de type String est immuable. Chaque fois que vous utilisez l'une des méthodes dans le Système.Classe String, vous créez un nouvel objet string en mémoire, ce qui implique une nouvelle répartition de l'espace pour ce nouvel objet. Dans les situations où vous avez besoin pour effectuer les modifications répétées à une chaîne, les frais généraux associés à la création d'un nouvel objet de type String peut être coûteux. Le Système.Texte.Classe StringBuilder peut être utilisé lorsque vous souhaitez modifier une chaîne de caractères sans la création d'un nouvel objet. Par exemple, à l'aide de la classe StringBuilder d'améliorer les performances lors de la concaténation de plusieurs chaînes dans une boucle.
La différence entre la Chaîne et StringBuilder ?
Chaîne de caractères:
String est immuable. Immuable signifie une fois que nous créons l'objet de corde nous ne pouvons pas modifier. Toute opération d'insertion, de remplacer ou d'ajouter des arrivé de changer de chaîne il suffit simplement qu'il va jeter l'ancienne valeur et il va créer une nouvelle instance en mémoire pour contenir la nouvelle valeur.
Exemple:
string str = "hi";
str += "hello"; // New string instance will be created, instead of changing the old one
str += "hw r u"; // Again new string instance will be created, instead of changing the old one
StringBuilder:
Le générateur de chaîne est mutable cela signifie une fois que nous avons créer le générateur de chaîne d'objet, nous pouvons effectuer toute opération d'insertion, de remplacer ou d'ajouter sans la création d'une nouvelle instance à chaque fois.
Exemple:
StringBuilder sb = new StringBuilder("");
sb.Append("hi");
sb.Append("hello");
string str = sb.ToString();