5 votes

Incompréhension de String immuable ou une erreur dans la documentation ?

Je viens de voir cela dans la documentation de MS Visual Studio et la partie en gras ne me semble pas logique. Est-ce incorrect ou est-ce que je ne comprends pas correctement? Si vous exécutez ceci, b semble contenir "hello" (comme je m'y attendrais) et non "h".

Les chaines de caractères sont immuables - le contenu d'un objet de chaîne de caractères ne peut pas être modifié après la création de l'objet, bien que la syntaxe donne l'impression que vous pouvez le faire. Par exemple, lorsque vous écrivez ce code, le compilateur crée en réalité un nouvel objet de chaîne de caractères pour contenir la nouvelle séquence de caractères, et la variable b continue de contenir "h".

string b = "h";

b += "ello";

2voto

James Curran Points 55356

Une chaîne ne peut pas changer, mais une variable de chaîne peut se voir attribuer une valeur différente. Ce que vous faites est plus proche de :

string b = "h";
string temp = b + "ello";
b = temp;

Pour montrer l'immutabilité réelle de la chaîne, cela échouera :

   string b = "hello";
   if(b[0] == 'h')  // nous pouvons lire via l'indexeur
      b[0] = 'H';   // mais cela échouera.

1voto

Mark Heath Points 22240

Il y a maintenant trois chaînes de caractères. L'une est l'originale "h", l'autre est "ello" et la troisième est "hello". Votre variable b pointe vers la chaîne de caractères "hello". Les deux autres chaînes n'ont pas de références et peuvent être jetées par le ramasse-miettes.

0voto

Morgan Cheng Points 15101

Chaîne b = "h"; b += "ello";

b est juste une référence à l'objet dans le tas. En fait, après l'opération "+=", b ne fait plus référence à l'original "h". Maintenant, il fait référence à un nouvel objet de chaîne "hello" qui est la concaténation de "h" et "ello". La chaîne "h" sera collectée par le GC.

0voto

Whisk Points 1903

Ce qui se passe, c'est que vous créez une nouvelle variable qui contient 'hello', puis vous changez b pour qu'il fasse référence à cela, la mémoire pour le 'ancien' b contient toujours 'h', mais cela n'est plus nécessaire donc le ramasse-miettes va le nettoyer. C'est pourquoi il est si bon d'utiliser des stringbuilders lors de l'itération et de l'assemblage de chaînes - voir ce lien pour plus d'informations.

0voto

SeaDrive Points 1289

Je ne sais pas ce que fait C#, mais j'ai lu à ce sujet en Java, et une implémentation basée sur Java serait plus proche de ceci :

string b = "h" ;

b = (new StringBuilder(b)).Append("ello").ToString() ;

Le point est que le "+" ou "Append" n'existe pas pour les chaînes de caractères car les chaînes de caractères sont immuables.

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