Voici une bonne façon de penser à la différence entre les types de valeur, le passage par valeur, les types de référence et le passage par référence :
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 entraîne la mutation de l'instance qu'elle contient. La modification d'une variable de type référence entraîne la mutation de l'instance vers laquelle elle pointe.
Des variables de type référence distinctes 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 passé par valeur est un nouveau conteneur avec une nouvelle copie du contenu. Un argument passé par référence est le conteneur original avec son contenu original.
Lorsqu'un argument de type valeur est transmis par valeur : La réaffectation du contenu de l'argument n'a aucun effet hors 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 passé 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. Modifier le contenu de l'argument affecte la portée externe, car le pointeur copié pointe vers une instance partagée.
Quand un argument est passé par référence : La réaffectation du contenu de l'argument affecte la portée externe, car le conteneur est partagé. Modifier le contenu de l'argument affecte la portée externe, car le contenu est partagé.
En conclusion :
Une variable de type chaîne est une variable de type référence. Elle contient donc un pointeur vers une instance stockée ailleurs. Lorsqu'elle est passée par valeur, son pointeur est copié, de sorte que la modification d'un argument de type chaîne devrait affecter l'instance partagée. Cependant, une instance de chaîne n'a pas de propriétés mutables, donc un argument de chaîne ne peut pas être modifié de toute façon. Lorsqu'il est passé par référence, le conteneur du pointeur est partagé, donc la réaffectation affectera toujours la portée externe.