Je comprends que si je passe une valeur de type ( int
, struct
, etc.) comme paramètre (sans le 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 un nouveau.
Mais avec les types référence, comme les classes, même sans le ref
mot - clé, une référence est passée à la méthode, pas une copie. Alors, quelle est l'utilisation du ref
mot - clé avec des types de référence?
Prends pour exemple:
var x = new Foo();
Quelle est la différence entre ce qui suit?
void Bar(Foo y) {
y.Name = "2";
}
et
void Bar(ref Foo y) {
y.Name = "2";
}
c#
parameters
pass-by-reference
pass-by-value
Andreas Grech
la source
la source
Il existe des cas où vous souhaitez modifier la référence réelle et non l'objet pointé:
la source
Jon Skeet a écrit un excellent article sur le passage de paramètres en C #. Il détaille clairement le comportement exact et l'utilisation des paramètres de passage par valeur, par référence (
ref
) et par sortie (out
).Voici une citation importante de cette page concernant les
ref
paramètres:la source
Très bien expliqué ici: http://msdn.microsoft.com/en-us/library/s6938f28.aspx
Résumé de l'article:
la source
Lorsque vous transmettez un type de référence avec le mot clé ref, vous transmettez la référence par référence et la méthode que vous appelez peut attribuer une nouvelle valeur au paramètre. Ce changement se propagera à la portée appelante. Sans ref, la référence est passée par valeur, et cela ne se produit pas.
C # a aussi le mot-clé 'out' qui ressemble beaucoup à ref, sauf qu'avec 'ref', les arguments doivent être initialisés avant d'appeler la méthode, et avec 'out' vous devez affecter une valeur dans la méthode de réception.
la source
Il permet de modifier la référence transmise. Par exemple
Vous pouvez également utiliser out si vous ne vous souciez pas de la référence transmise:
la source
Un autre tas de code
la source
En plus des réponses existantes:
Comme vous avez demandé la différence entre les 2 méthodes: Il n'y a pas de co (ntra) variance lors de l'utilisation de
ref
ouout
:la source
Un paramètre dans une méthode semble toujours transmettre une copie, la question est une copie de quoi. Une copie est effectuée par un constructeur de copie pour un objet et comme toutes les variables sont des objets en C #, je pense que c'est le cas pour toutes. Les variables (objets) sont comme des personnes vivant à certaines adresses. Nous changeons les personnes vivant à ces adresses ou nous pouvons créer plus de références aux personnes vivant à ces adresses dans l'annuaire téléphonique (faire des copies superficielles). Ainsi, plus d'un identifiant peut faire référence à la même adresse. Les types de référence souhaitent plus d'espace, donc contrairement aux types de valeur qui sont directement connectés par une flèche à leur identifiant dans la pile, ils ont une valeur pour une autre adresse dans le tas (un plus grand espace pour habiter). Cet espace doit être extrait du tas.
Type de valeur: identificateur (contient valeur = adresse de la valeur de pile) ----> Valeur du type de valeur
Type de référence: Identificateur (contient valeur = adresse de la valeur de la pile) ----> (contient valeur = adresse de la valeur du tas) ----> Valeur du tas (contient le plus souvent des adresses vers d'autres valeurs), imaginez plus de flèches collées dans différentes directions vers Array [0], Array [1], array [2]
La seule façon de changer une valeur est de suivre les flèches. Si une flèche est perdue / modifiée de la manière dont la valeur est inaccessible.
la source
Les variables de référence transportent l'adresse d'un endroit à un autre de sorte que toute mise à jour sur eux à n'importe quel endroit reflétera sur tous les endroits ALORS quelle est l'utilisation de REF. La variable de référence (405) est bonne jusqu'à ce qu'aucune nouvelle mémoire ne soit allouée à la variable de référence passée dans la méthode.
Une fois la nouvelle mémoire allouée (410) alors le changement de valeur sur cet objet (408) ne se reflétera pas partout. Pour cette référence vient. Ref est une référence de référence, donc chaque fois qu'une nouvelle mémoire allouée, elle le sait car elle pointe vers cet emplacement, la valeur peut donc être partagée par everyOne. Vous pouvez voir l'image pour plus de clarté.
la source