est ici une bonne façon de penser à la différence entre les types de valeur, les valeurs de passage, les types de référence et les références de passage:
Une variable est un conteneur.
Une variable de type valeur contient une instance. Une variable de type référence contient un pointeur vers une instance stockée ailleurs.
La modification d'une variable de type valeur fait muter l'instance qu'elle contient. La modification d'une variable de type référence mute l'instance vers laquelle elle pointe.
Les variables de type référence séparées peuvent pointer vers la même instance. Par conséquent, la même instance peut être mutée via n'importe quelle variable qui pointe vers elle.
Un argument transmis-par-valeur est un nouveau conteneur avec une nouvelle copie du contenu. Un argument transmis par référence est le conteneur d'origine avec son contenu d'origine.
Lorsqu'un argument de type valeur est transmis valeur par valeur: La réaffectation du contenu de l'argument n'a aucun effet en dehors de la portée, car le conteneur est unique. La modification de l'argument n'a aucun effet en dehors de la portée, car l'instance est une copie indépendante.
Lorsqu'un argument de type référence est transmis valeur par valeur: La réaffectation du contenu de l'argument n'a aucun effet en dehors de la portée, car le conteneur est unique. La modification du contenu de l'argument affecte la portée externe, car le pointeur copié pointe vers une instance partagée.
Lorsqu'un argument est transmis-par-référence: La réaffectation du contenu de l'argument affecte la portée externe, car le conteneur est partagé. La modification du contenu de l'argument affecte la portée externe, car le contenu est partagé.
En conclusion:
Une variable de chaîne est une variable de type de référence. Par conséquent, il contient un pointeur vers une instance stockée ailleurs. Lors de la transmission d'une valeur, son pointeur est copié. La modification d'un argument de chaîne doit donc affecter l'instance partagée. Cependant, une instance de chaîne n'a aucune propriété mutable, donc un argument de chaîne ne peut pas être modifié de toute façon. Lorsqu'il est transmis par référence, le conteneur du pointeur est partagé, de sorte que la réaffectation affecte toujours la portée externe.
Voir l'article référencé par Jon ci-dessous. Le comportement que vous mentionnez peut également être reproduit par des pointeurs C++. – Sesh
Très belle explication dans [MSDN] (http://msdn.microsoft.com/en-us/library/s6938f28.aspx) aussi. –
Copie possible de [En C#, pourquoi String est un type de référence qui se comporte comme un type de valeur?] (Http://stackoverflow.com/questions/636932/in-c-why-is-string-a-reference-type -that-like-like-a-value-type) – Liam