Différence entre string et StringBuilder en c#

j'aimerais connaître la différence entre string et StringBuilder et avoir aussi besoin d'exemples pour comprendre.

60
demandé sur S.L. Barth 2010-06-18 16:09:47

13 réponses

Un string instance est immuable. Vous ne pouvez pas le changer après qu'il ait été créé. Toute opération qui semble modifier la chaîne 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

les objets immuables ont de belles propriétés, comme qu'ils peuvent être utilisés à travers les threads sans crainte de problèmes de synchronisation ou que vous pouvez simplement distribuer vos champs de soutien privés directement sans crainte que quelqu'un change les objets qu'ils ne devraient pas changer (voir tableaux ou listes mutables, qui ont souvent besoin d'être copiés avant de les retourner si ce n'est pas souhaité). Mais lorsqu'ils sont utilisés négligemment, ils peuvent créer de graves problèmes de performance (comme presque tout – si vous avez besoin d'un exemple d'un langage qui s'enorgueillit de la vitesse d'exécution, regardez les fonctions de manipulation des chaînes de caractères de C).

quand vous avez besoin d'une chaîne de caractères mutable , comme celle que vous construisez pièce par pièce ou où vous changez beaucoup de choses, alors vous aurez besoin d'un StringBuilder qui est un tampon de caractères peut être changé. Cela a, pour la plupart, des répercussions sur le rendement. Si vous voulez une chaîne mutable et que vous le faites avec une instance normale string , alors vous finirez par créer et détruire beaucoup d'objets inutilement, alors qu'une instance StringBuilder elle-même changera, annulant le besoin de nombreux nouveaux objets.

exemple Simple: les programmeurs grincer des dents avec douleur:

string s = string.Empty;
for (i = 0; i < 1000; i++) {
  s += i.ToString() + " ";
}

vous allez finir par créer 2001 cordes ici, dont 2000 sont jetés. Le même exemple utilisant StringBuilder:

StringBuilder sb = new StringBuilder();
for (i = 0; i < 1000; i++) {
  sb.Append(i);
  sb.Append(' ');
}

cela devrait placer beaucoup moins de stress sur l'allocateur de mémoire: -)

il faut noter cependant que le compilateur C# est raisonnablement intelligent quand il s'agit de chaînes. Par exemple, la ligne suivante

string foo = "abc" + "def" + "efg" + "hij";

sera être rejoint par le compilateur, ne laissant qu'une seule chaîne à l'exécution. De même, des lignes telles que

string foo = a + b + c + d + e + f;

sera réécrit en

string foo = string.Concat(a, b, c, d, e, f);

donc vous n'avez pas à payer pour cinq concaténations absurdes qui seraient la façon naïve de gérer cela. Cela ne vous sauvera pas dans les boucles comme ci-dessus (à moins que le compilateur ne déroule la boucle mais je pense que seul le JIT peut effectivement le faire et mieux ne pas parier là-dessus).

89
répondu Joey 2012-03-26 12:06:49

chaîne de caractères est immuable, ce qui signifie que lorsque vous créez une chaîne de caractères, vous ne pouvez jamais la changer, elle créera plutôt une nouvelle chaîne de caractères pour stocker la nouvelle valeur, ce qui peut être inefficace si vous avez besoin de changer la valeur d'une variable chaîne de caractères beaucoup.

Stringbuilder peut être utilisé pour simuler une chaîne mutable donc est bon pour quand vous avez besoin de changer une chaîne beaucoup.

6
répondu Hans Olsson 2010-06-18 12:14:02

String Vs StringBuilder

  • Chaîne
  1. sous espace de noms de système
  2. instance immuable(en lecture seule)
  3. les performances se dégradent lorsque le changement continu de la valeur se fait
  4. thread safe
  • StringBuilder (chaîne mutable))
    1. sous système.Texte namespace
    2. instance mutable
    3. montre une meilleure performance puisque de nouvelles modifications sont apportées à l'instance existante

    article descriptif sur ce sujet avec beaucoup d'exemples en utilisant ObjectIDGenerator , suivre ce lien

    Liées Stackeoverflow Question: la Mutabilité de la chaîne lors de chaîne ne change pas en C#?

    6
    répondu Shamseer K 2018-08-12 03:34:12

    Chaîne Une instance String est immuable, c'est-à-dire que nous ne pouvons pas la changer après qu'elle ait été créée. Si nous exécutons n'importe quelle opération sur une corde il retournera une nouvelle instance(crée une nouvelle instance dans la mémoire) au lieu de modifier la valeur d'instance existante.

    StringBuilder StringBuilder est mutable, c'est-à-dire que si nous effectuons n'importe quelle opération sur StringBuilder il mettra à jour la valeur d'instance existante et il ne créera pas de nouvelle instance.

    http://www.dotnetlearners.com/blogs/view/180/Difference-between-String-and-StringBuilder.aspx

    3
    répondu Ram 2015-11-06 14:02:56

    un éditeur de chaîne vous aidera lorsque vous avez besoin de construire des chaînes en plusieurs étapes.

    au lieu de faire ceci:

    String x = "";
    x += "first ";
    x += "second ";
    x += "third ";
    

    vous ne

    StringBuilder sb = new StringBuilder("");
    sb.Append("first ");
    sb.Append("second ");
    sb.Append("third");
    String x = sb.ToString();
    

    l'effet final est le même, mais le StringBuilder utilisera moins de mémoire et fonctionnera plus rapidement. Au lieu de créer une nouvelle chaîne qui est la concaténation des deux, il créera les morceaux séparément, et seulement à la fin il les unira.

    2
    répondu Palantir 2010-06-18 12:13:41

    De la Classe StringBuilder documentation :

    L'objet String est immuable. Chaque fois que vous utilisez une des méthodes du système.Classe String, vous créez un nouvel objet string en mémoire, ce qui nécessite une nouvelle allocation d'espace pour ce nouvel objet. Dans les situations où vous avez besoin d'effectuer des modifications répétées à une chaîne de caractères, les frais généraux associés à la création d'un nouvel objet String peuvent être coûteux. Le Système.Texte.La classe StringBuilder peut être utilisée lorsque vous voulez modifier une chaîne sans créer un nouvel objet. Par exemple, L'utilisation de la classe StringBuilder peut augmenter les performances en concaténant plusieurs chaînes ensemble dans une boucle.

    2
    répondu Bill the Lizard 2010-06-18 12:14:08

    différence majeure:

    La chaîne

    est immuable. Cela signifie que vous ne pouvez pas modifier string du tout, le résultat de la modification est une nouvelle string. Ce n'est pas efficace si vous prévoyez d'ajouter à la chaîne

    StringBuilder est mutable. Il peut être modifié de n'importe quelle façon et il ne nécessite pas la création d'une nouvelle instance. Lorsque le travail est terminé, ToString() peut être appelé pour obtenir la chaîne.

    cordes peuvent participer à l'interning, il signifie que les chaînes avec le même contenu peut avoir les mêmes adresses. StringBuilder ne peut pas être interné.

    String est la seule classe qui peut avoir la référence littérale.

    1
    répondu Andrey 2010-06-18 12:16:35

    les cordes sont immuables I. e si vous changez sa valeur, l'ancienne valeur sera rejetée et une nouvelle valeur sera créée sur heap tandis que dans string builder nous pouvons modifier la valeur existante sans que la nouvelle valeur soit créée. Ainsi, Performance wise String Builder est bénéfique car nous n'occupons pas inutilement plus d'espace mémoire.

    1
    répondu Nitin Nayyar 2015-01-01 18:24:42

    une chaîne de caractères est un type immuable. Cela signifie que chaque fois que vous commencez à concaténer des cordes les uns avec les autres, vous créez de nouvelles cordes à chaque fois. Si vous le faites tant de fois, vous finissez avec beaucoup de surcharge et le risque de manquer de mémoire.

    une instance StringBuilder est utilisée pour ajouter des chaînes à la même instance, créant une chaîne lorsque vous appelez la méthode ToString dessus.

    en raison de frais généraux d'instantiating a Objet StringBuilder il est dit par Microsoft qu'il est utile d'utiliser lorsque vous avez plus de 5-10 concaténations de chaîne.

    pour le code échantillon je vous suggère de jeter un oeil ici:

    http://msdn.microsoft.com/en-us/library/system.string.aspx http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

    http://msdn.microsoft.com/en-us/library/2839d5h5 (VS.71).aspx

    Grz, Kris.

    0
    répondu Kris van der Mast 2010-06-18 12:16:08

    Une Chaîne De Caractères (Le Système.String) est un type défini dans le framework .NET. La classe String n'est pas mutable. Cela signifie que chaque fois que vous effectuez une action à un Système.Instance String, le compilateur .NET crée une nouvelle instance de la chaîne. Cette opération est cachée au développeur.

    Un Système.Texte.StringBuilder est une classe qui représente une chaîne mutable. Cette classe fournit une méthode utile qui permet à l'utilisateur de gérer la chaîne enveloppée par le StringBuilder. Notez que toutes les manipulations sont faites sur la même instance de StringBuilder.

    Microsoft encourager l'utilisation de StringBuilder cause de est plus efficace en termes d'utilisation de la mémoire.

    0
    répondu AngeloBad 2010-06-18 12:19:41

    aussi la complexité des concaténations de chaîne est O(N2) tandis que pour StringBuffer est O(N). Donc, il pourrait y avoir des problèmes de performance où nous utilisons des concaténations dans des boucles comme beaucoup de nouveaux objets créés à chaque fois.

    0
    répondu Vinay Lodha 2010-06-18 13:05:25

    vous pouvez utiliser la méthode Clone si vous voulez itérer à travers les chaînes avec le constructeur de chaînes.. Il renvoie un objet de sorte que vous pouvez convertir en chaîne en utilisant la méthode ToString...:)

    0
    répondu user2440156 2013-07-12 04:38:50
    Système

    . La chaîne est Mutable objet signifie pas modifié après sa création, veuillez consulter ci-dessous URLfor mieux comprendre

    http://developer-insight.blogspot.com/2017/04/different-between-system.html

    0
    répondu Amila Munasinghe 2017-04-19 08:24:22