76 votes

Différence entre string et StringBuilder en c #

Je voudrais connaître la différence entre string et StringBuilder et avoir également besoin d'exemples pour comprendre.

113voto

Joey Points 148544

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).

7voto

ho1 Points 31752

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.

3voto

Andrey Points 36869

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.

2voto

Bill the Lizard Points 147311

À 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.

1voto

vikram reddy Points 1

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();

Lire plus sur "les Différences entre la Chaîne et StringBuilder" sous forme de tableau, avec un exemple ici.

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