Les chaînes sont considérées comme des types de référence mais peuvent agir comme des valeurs. Lorsque vous copiez quelque chose manuellement ou avec MemberwiseClone(), comment sont traitées les chaînes? Sont-ils considérés comme séparés et isolés de la copie et du maître?Comment fonctionnent les chaînes lorsque vous copiez quelque chose en C#?
Répondre
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.
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.
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.
- 1. Quelque chose comme les paramètres C# en C++?
- 2. Comment testeriez-vous quelque chose qui filtre des objets complexes?
- 3. C# menu tooltrip & quelque chose de plus
- 4. Lire quelque chose après un mot en C++
- 5. Comment faire valoir quelque chose à la compilation en Java?
- 6. Quelque chose comme print END << END; en C++?
- 7. Y at-il quelque chose comme une base de données de traduction pour les chaînes?
- 8. C# - Afficher les différences lorsque l'on compare les chaînes
- 9. Les raccourcis clavier ne fonctionnent pas lorsque vous ajoutez un formulaire à un panneau C#
- 10. Copiez un bloc de pixels de taille arbitraire dans la texture OpenGL ES ... en quelque sorte?
- 11. Comment convertir quelque chose de "string *" en "const string &" en C++?
- 12. Comment facilement convertir un objet DbDataReader en quelque chose d'utile?
- 13. Flex TileGrid: Pourquoi copiez-vous par défaut lorsque je fais glisser et déposez vos éléments?
- 14. Quelque chose comme TryParse pour les dates/heures en C++ (non-Windows)?
- 15. Comment faire quelque chose comme ça dans Scala?
- 16. Quelque chose fonctionne comme "did Init" ?? [objectif-c]
- 17. Comment pourriez-vous implémenter quelque chose comme les bases de données d'Excel 2007 en HTML/CSS/JS?
- 18. Il y a vraiment quelque chose comme Objective C++?
- 19. Pouvez-vous développer pour WebOS dans quelque chose en dehors de CSS/HTML/Javascript?
- 20. Quand décidez-vous de représenter quelque chose en tant que vecteur?
- 21. Comment faire quelque chose à tous les fichiers dans un répertoire en utilisant bash?
- 22. Comment vérifier si l'itérateur STL pointe sur quelque chose?
- 23. composant ImageGrid ou quelque chose comme ça
- 24. C++ vecteur littéraux, ou quelque chose comme eux
- 25. Qu'est-ce qu'un exemple réel de quelque chose que vous représenteriez avec un hachage?
- 26. comment faire correspondre quelque chose avec RegExp entre roundbrackets
- 27. Comment glisser et déposer quelque chose dans un contrôle statique?
- 28. Comment réaliser quelque chose comme le classement latin1_general_ci de MySQL en PHP?
- 29. chaînes en C++
- 30. faire quelque chose si vue des charges
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
... cela explique aussi pourquoi String.Replace doit retourner une nouvelle chaîne, plutôt que de changer la chaîne. – stusmith
Si vous avez besoin d'une chaîne mutable, pensez à utiliser StringBuilder. – stusmith