Voici un bon moyen de réfléchir à 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 mute l'instance qu'elle contient. La modification d'une variable de type référence mute 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 d'origine avec son contenu d'origine.
Lorsqu'un argument de type valeur est passé par valeur: la réattribution 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 passé par valeur: la réattribution 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 passé par référence: la réattribution 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 chaîne est une variable de type référence. Par conséquent, il contient un pointeur vers une instance stockée ailleurs. Lorsqu'il est passé par valeur, son pointeur est copié, donc la modification d'un argument de 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.