Qu'est-ce que l'utilisation de “ref” pour la référence de type de variables en C#?
Je comprends que si je passe une valeur de type (int
, struct
, etc.) comme un paramètre (sans les ref
mot-clé), une copie de cette variable est passée à la méthode, mais si j'utilise le ref
mot-clé une référence à cette variable est passée, pas une nouvelle.
Mais avec référence-types, comme les classes, même sans le ref
mot-clé, une référence est passé à la méthode, pas une copie. Alors, quelle est l'utilisation de la ref
mot-clé de référence-types?
Prendre pour exemple:
var x = new Foo();
Quelle est la différence entre la suivante?
void Bar(Foo y) {
y.Name = "2";
}
et
void Bar(ref Foo y) {
y.Name = "2";
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez modifier ce
foo
points à l'aide dey
:ref
mot-clé.Il ya des cas où vous souhaitez modifier le réel référence et non pas de l'objet pointé:
Jon Skeet a écrit un excellent article sur la transmission de paramètres en C#. Il détaille clairement le exacte du comportement et de l'utilisation de passage de paramètres par valeur, par référence (
ref
), et par sortie (out
).Ici un important citation de la page par rapport à
ref
paramètres:Très bien expliqué ici :
http://msdn.microsoft.com/en-us/library/s6938f28.aspx
Résumé de l'article:
Lorsque vous passez d'un type de référence avec le mot-clé ref, vous passer la référence par référence, et la méthode que vous appelez peut affecter une nouvelle valeur pour le paramètre. Ce changement va se propager à l'appel de la portée. Sans ref, la référence est passée par valeur, et cela n'arrive pas.
C# a aussi le " out "mot qui est un peu comme ref, sauf qu'avec "ref", les arguments doivent être initialisées avant d'appeler la méthode, et avec "out", vous devez attribuer une valeur dans la méthode de réception.
Il vous permet de modifier la référence passée. par exemple,
Vous pouvez également utiliser hors si vous n'avez pas de soins sur la référence transmise à:
Un autre tas de code
Dans les réponses:
Comme vous l'avez demandé la différence entre les 2 méthodes: Il n'y a pas de co(ntra)écart lors de l'utilisation de
ref
ouout
:Un paramètre d'une méthode semble être en passant toujours une copie, la question est une copie de ce. Une copie est fait par un constructeur de copie pour un objet et puisque toutes les variables sont l'Objet en C#, je crois que c'est le cas pour tous. Variables(objets) sont comme les personnes vivant à certaines adresses. Soit de changer les personnes vivant à ces adresses ou on peut créer plus de références pour les personnes vivant à ces adresses dans l'annuaire téléphonique(faire peu profondes des copies). Ainsi, plus d'un identificateur peut se référer à la même adresse. Les types de référence désir de plus d'espace, donc, à la différence des types de valeur sont directement reliés par une flèche à leur identifiant dans la pile, ils ont de la valeur pour une autre adresse dans le tas( un plus grand espace à habiter). Cet espace doit être pris dans le tas.
Type de la valeur:
Identifiant(contient la valeur =adresse de la pile de la valeur)---->Valeur de valeur de type
Type de référence:
Identificateur(contient la valeur=adresse de la pile de la valeur)---->(contient la valeur=adresse de segment de mémoire de la valeur)---->Tas de la valeur(le plus souvent contenir des adresses à d'autres valeurs), imaginez plus de flèches les coller dans des directions différentes à Tableau[0], Tableau[1], tableau[2]
La seule façon de changer une valeur est de suivre les flèches. Si une flèche est perdu ou changé dans la façon dont la valeur est inaccessible.
Référence à des Variables effectuer l'adresse d'un endroit à l'autre de sorte que toute mise à jour sur eux à n'importe quel endroit vous permettra de réfléchir sur tous les lieux ALORS qu'est-ce que l'utilisation de la RÉF.
Variable de référence (405) en sont de bons jusqu'aucune nouvelle de mémoire est allouée à la référence de la variable transmise dans la méthode.
Une nouvelle mémoire à allouer (410), alors le changement de valeur sur cet objet (408) ne reflète pas partout.
Pour cette réf vient. Ref est la référence de la référence et donc à chaque fois une nouvelle mémoire à allouer pour le savoir, car il pointe vers l'emplacement par conséquent, la valeur peut être partagée par tout le monde. Vous pouvez voir l'image pour plus d'clearity.