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";

0voto

OscarRyz Points 82553

Essayez ceci :

chaîne b = "h";
chaîne c = b + "ello";    // b reste égal à "h", c = "hello" 
chaîne d = string.concat(b, "ello"); // d == hello, b reste "h"

Pourquoi b est-il toujours "h" ? Parce que "b" n'est pas un objet, c'est une référence à un objet. Il n'y a rien que vous puissiez faire pour modifier l'objet référencé par b. Si les chaînes étaient mutables, alors en utilisant :

chaîne b = "ello";
chaîne f = b.Insert("h",0);

modifierait b en "hello" (car h a été inséré à la position 0) mais comme elle est immuable, b reste "ello".

Si vous changez la référence vers un autre objet, c'est une autre histoire.

b = "ello";
b = "Une autre chaîne";
// b référence maintenant "Une autre chaîne", mais l'objet "ello" reste inchangé.

J'espère que cela vous aide (et fonctionne :S)

0voto

shahkalpesh Points 21553

Tout simplement, les chaînes de caractères ne peuvent pas être modifiées sur place (si une chaîne de caractères est un tableau de caractères)

0voto

supercat Points 25534

Il serait peut-être plus clair de considérer tous les emplacements de stockage de type classe comme contenant des "identifiants d'objet". Supposons que, initialement, le compilateur ait attribué ID #123 à la chaîne "h" et ait attribué ID #547 à la chaîne "ello". Ensuite, après l'instruction b = "h";, la variable b contiendra ID #123. L'instruction b += "ello"; amènera le compilateur à passer ID #123 et ID #547 à l'opérateur + pour les chaînes, qui les transmettra à son tour à la méthode String.Concat. Cette méthode demandera alors au système de créer un nouvel objet (par exemple ID #915) de type System.String, contenant les cinq caractères "hello", et renverra cet objet à l'appelant. Le compilateur stockera alors ID #915 dans b.

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