Passer par copie ou référence?
Je suis un peu novice en C# et me demandais juste si il y a une liste de classes (couramment utilisé) qui sont, par défaut, passé en tant que copie. Comment puis-je identifier?
Je sais la de base de base les types d'objet — int, uint, flottants, chaînes de caractères, ... — sont transmis par copie.
Thomas Levesque réponse répond à la question. Juste une remarque supplémentaire, lorsque les types de valeur sont copiés, il est par défaut, seule une copie superficielle - si une structure contient un type de référence, la copie de point à la même référence de l'objet plutôt que le clonage d'un nouvel objet.
OriginalL'auteur tvr | 2010-08-24
Vous devez vous connecter pour publier un commentaire.
En C# /.Net les objets peuvent être classés comme valeur de référence ou de types [1]. Types de valeur sont n'importe quel type qui en découlent
System.ValueType
et sont définis en C# avec lestruct
déclaration de type. Ceux-ci sont passés par copie /valeur.Types de référence sont des types qui ne dérivent pas de
System.ValueType
et sont définis en C# avec leclass
mot-clé. Les identifiants à des instances de types de référence sont connus comme des références (similaires à des pointeurs). Ce sont aussi passés par valeur par défaut, mais seulement la référence est passée pas l'objet entier.Votre question a également mentionné que
string
instances sont passés par copie.String
.Net est un type de référence (dérive directement deSystem.Object
) et n'est donc pas passé par copie complète.[1] Pointeurs peuvent mérite de leur propre classe ici, mais je suis ignorant, pour cette discussion.
OriginalL'auteur JaredPar
Tous les types, par défaut, sont passés par valeur. La différence entre types de valeur (
struct
) et types de référence (class
), c'est que pour les types de valeur d'un copie de la valeur est passée à la méthode, alors que pour les types référence, une seule référence est passé.Voir MSDN pour plus de détails.
Aussi, ne pas confondre la notion de valeur et les types référence, et la notion de passage de paramètres par valeur ou par référence. Voir cet article par Jon Skeet pour plus de détails
En effet, qui a été mal posé... j'ai corrigé
-1, cette affirmation est tout simplement fausse et jaredpar est correct.
Enlevé mon -1, que vous avez corrigé votre réponse.
OriginalL'auteur Thomas Levesque
En général,
types de valeur, qui comprend les types natifs (
int
,float
, ...) ainsi questruct
s sont transmis par copie" (comme vous dites), alors que danstypes de référence, qui comprend
class
es, une seule référence est copié à la place de l'objet complet.Noter, cependant, que chaîne est pas passé "copier"! C'est un type de référence, mais puisqu'il est immuable, il se comporte de façon similaire à un type de valeur.
Noter que le
ref
mot-clé peut être utile dans les deux cas: Dans le cas de types de valeur, cela signifie que la valeur est recopiée. Dans le cas de types de référence, cela signifie que le référence peut être changé (c'est à dire, que vous pouvez attribuer à la variable à un nouvel objet, plutôt que de simplement en changeant les propriétés de l'objet.)-1 tous les types sont passés par valeur en c#, sauf si vous utilisez la ref ou des mots-clés. Il se trouve simplement qu'en ce qui concerne les types de la valeur est la référence. par exemple, si vous passez d'un type de référence à la méthode, et de la régler à la valeur null dans la méthode, si elle n'est pas null, la variable passée dans la COPIE de la méthode.
Exactement, c'est pourquoi j'ai évité le membre de phrase "par référence" dans le second cas et explicitement évoqué l'utilisation du mot-clé ref. J'ai reformulé ma réponse pour rendre cela plus clair.
enlevé mon -1 parce que vous avez mis à jour votre réponse afin d'être plus clair.
Merci (pour la suppression de l'-1 ainsi que pour les commentaires).
OriginalL'auteur Heinzi
Note également que la structure des objets peuvent inclure les types de référence:
Lors de votre utilisation de cette structure comme ceci:
Puis
Si vous avez déclaré la Devise de la classe, puis les références au Code ont été les mêmes.
OriginalL'auteur Petr Kozelek