2009-02-03 2 views

Répondre

40

Les chaînes sont des types de référence. Cependant, ils sont immuables (ils ne peuvent pas être changés), donc cela n'aurait pas vraiment d'importance s'ils étaient copiés par valeur, ou copiés par référence.

Si elles sont copiées à faible profondeur, la référence sera copiée ... mais vous ne pouvez pas les modifier de sorte que vous ne puissiez pas affecter deux objets à la fois.

+0

Alors quand je change la chaîne dans l'objet de copie, une nouvelle chaîne est créée avec une nouvelle référence? Donc, quand je fais quelque chose comme oldString = oldString + "A", je crée un nouvel objet avec une nouvelle référence? – danmine

+1

... cela explique aussi pourquoi String.Replace doit retourner une nouvelle chaîne, plutôt que de changer la chaîne. – stusmith

+0

Si vous avez besoin d'une chaîne mutable, pensez à utiliser StringBuilder. – stusmith

6

Vous ne copiez une référence (pensez "pointeur"); les deux références sont séparées (mais ont la même valeur), mais il n'y a qu'un seul objet chaîne.

21

Considérez ceci:

public class Person 
{ 
    string name; 
    // Other stuff 
} 

Si vous appelez MemberwiseClone, vous finirez avec deux instances distinctes de la personne, mais leurs variables name, bien que distinctes, aura la même valeur - ils font référence à la même instance de chaîne. C'est parce que c'est un clone peu profond. Si vous changez le nom dans une de ces instances, cela n'affectera pas l'autre, car les deux variables elles-mêmes sont séparées - vous changez simplement la valeur de l'une d'elles pour faire référence à une chaîne différente.

Questions connexes