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.
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).
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.
String Vs StringBuilder
- Chaîne
- sous espace de noms de système
- instance immuable(en lecture seule)
- les performances se dégradent lorsque le changement continu de la valeur se fait
- thread safe
- sous système.Texte namespace
- instance mutable
- 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#?
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
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.
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.
différence majeure:
La chaîneest 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.
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.
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.
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.
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.
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...:)
. 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