201 votes

Quelle est la différence entre une chaîne de caractères mutable et immuable en C# ?

Quelle est la différence entre une chaîne de caractères mutable et immuable en C# ?

2 votes

6 votes

Ce n'est pas identique. Très similaire, mais ce n'est pas la même chose qu'identique.

2 votes

Question connexe sur les éléments internes de StringBuilder stackoverflow.com/q/3564906/38206

328voto

Stephen C Points 255558

Mutable et immuable sont des mots anglais signifiant respectivement "peut changer" et "ne peut pas changer". La signification de ces mots est la même dans le contexte informatique, à savoir

  • une chaîne mutable peut être modifiée, et
  • une chaîne immuable ne peut pas être modifiée.

La signification de ces mots est la même en C# / .NET que dans les autres langages/environnements de programmation, même si (évidemment) les noms des types peuvent différer, tout comme d'autres détails.


Pour mémoire :

  • String est le type standard de chaîne immuable de C# / .Net
  • StringBuilder est le type de chaîne mutable standard de C# / .Net

Pour "effectuer un changement" sur une chaîne de caractères représentée sous forme de C# String vous créez en fait un nouveau String objet. L'original String ne change pas ... parce qu'il est immuable.

Dans la plupart des cas, il est préférable d'utiliser String parce qu'il est plus facile de raisonner à leur sujet ; par exemple, vous n'avez pas besoin d'envisager la possibilité qu'un autre fil puisse "changer ma chaîne".

Toutefois, lorsque vous devez construire ou modifier une chaîne de caractères à l'aide d'une séquence d'opérations, il peut être plus efficace d'utiliser un fichier de type StringBuilder . Par exemple, vous pouvez concaténer de nombreux fragments de chaîne pour former une grande chaîne :

  • Si vous faites cela comme une séquence de String concaténations, vous copiez O(N^2) les caractères, où N est le nombre de chaînes de caractères des composants.
  • Si vous utilisez un StringBuilder vous ne faites que copier O(N) des personnages.

Et enfin, pour les personnes qui affirment qu'une StringBuilder n'est pas une chaîne de caractères parce qu'elle n'est pas immuable, le système Microsoft documentation décrit StringBuilder ainsi :

"Représente un chaîne mutable de personnages. Cette classe ne peut être héritée."

185voto

Pankaj Agarwal Points 3807

String est immuable

c'est-à-dire que les chaînes de caractères ne peuvent pas être modifiées. Lorsque vous modifiez une chaîne (en la complétant par exemple), vous créez en fait une nouvelle chaîne.

Mais StringBuilder n'est pas immuable (il est plutôt mutable).

donc si vous devez modifier une chaîne de caractères plusieurs fois, par exemple en effectuant de multiples concaténations, utilisez alors StringBuilder .

4 votes

Que se passe-t-il si vous concattez plusieurs fois des chaînes immuables ? L'utilisation de beaucoup de mémoire pour les chaînes sans références ? Ou simplement lent ?

13 votes

@Rudie - les deux. Chaque concaténation crée un nouvel objet String, et copie tous les caractères des deux chaînes d'entrée. Cela conduit à O(N^2) comportement ...

0 votes

@StephenC a expliqué avec les mots-clés.

47voto

Unmesh Kondolikar Points 4744

Un objet est mutable si, une fois créé, son état peut être modifié en effectuant diverses opérations sur lui, sinon il est immuable.

Chaîne immuable

En C# (et .NET), une chaîne de caractères est représentée par la classe System.String. Le site string est un alias pour cette classe.

El La classe System.String est immuable, c'est-à-dire qu'une fois créée, son état ne peut pas être modifié. .

Donc toutes les opérations que vous effectuez sur une chaîne de caractères comme Substring , Remove , Replace la concaténation en utilisant l'opérateur '+', etc., créera une nouvelle chaîne et la renverra.

Voir le programme suivant pour la démonstration -

string str = "mystring";
string newString = str.Substring(2);
Console.WriteLine(newString);
Console.WriteLine(str);

Ceci imprimera respectivement 'string' et 'mystring'.

Pour le avantages de l'immutabilité et pourquoi les chaînes sont immuables vérifier Pourquoi .NET String est immuable ? .

Chaîne mutable

Si vous voulez avoir une chaîne de caractères que vous voulez modifier souvent, vous pouvez utiliser la fonction StringBuilder classe. Opérations sur un StringBuilder modifiera le même objet .

Pour plus de conseils sur quand utiliser StringBuilder se référer à Quand utiliser StringBuilder ? .

0 votes

Belle explication !

36voto

Adam Norberg Points 2336

Tous string Les objets sont immuables en C#. Les objets de la classe string une fois créés, ne peuvent jamais représenter une autre valeur que celle avec laquelle ils ont été construits. Toutes les opérations qui semblent "modifier" une chaîne de caractères en produisent une nouvelle. C'est inefficace pour la mémoire, mais extrêmement utile pour être sûr qu'une chaîne ne changera pas sous vos yeux, car tant que vous ne changez pas votre référence, la chaîne à laquelle vous faites référence ne changera jamais.

Un objet mutable, en revanche, possède des champs de données qui peuvent être modifiés. Une ou plusieurs de ses méthodes modifient le contenu de l'objet, ou bien il possède une propriété qui, lorsqu'elle est écrite, modifie la valeur de l'objet.

Si vous avez un objet mutable - le plus similaire à String est StringBuffer - alors vous devez en faire une copie si vous voulez être absolument sûr qu'il ne se dérobera pas sous vos yeux. C'est pourquoi il est dangereux d'utiliser des objets mutables comme clés dans une forme de Dictionary ou set - les objets eux-mêmes pourraient changer, et la structure de données n'aurait aucun moyen de le savoir, ce qui entraînerait des données corrompues qui, au final, feraient planter votre programme.

Cependant, vous pouvez modifier son contenu, ce qui est beaucoup, beaucoup plus efficace en termes de mémoire que de faire une copie complète parce que vous voulez changer un seul caractère, ou quelque chose de similaire.

En général, la bonne chose à faire est d'utiliser des objets mutables pendant que vous créez quelque chose, et des objets immuables une fois que vous avez terminé. Ceci s'applique aux objets qui ont des formes immuables, bien sûr ; la plupart des collections ne le font pas. Il est souvent utile de fournir des formes de collections en lecture seule, ce qui est l'équivalent de l'immuable, lorsque vous envoyez l'état interne de votre collection à d'autres contextes - sinon, quelque chose pourrait prendre cette valeur de retour, y faire quelque chose, et corrompre vos données.

12voto

Saurabh Points 11097

Immuable :

Lorsque vous effectuez une opération sur un objet, cela crée un nouvel objet et l'état n'est pas modifiable comme dans le cas d'une chaîne.

Mutable

Lorsque vous effectuez une opération sur un objet, l'objet lui-même est modifié, aucun nouvel objet n'est créé comme dans le cas de StringBuilder.

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