à l'aide de ref avec classe C#
Je veux donner une certaine liste liée à une classe, que je fais. Je veux la classe pour écrire dans cette liste (par exemple, par .addLast()).
Dois-je utiliser le ref
mot-clé pour qui?
Je suis un peu perplexe sur l'endroit où l'utilisation de la ref
et out
les mots clés de C#, comme tous les classes sont allouées dynamiquement sur le tas et nous fait utiliser des pointeurs pour la plupart des opérations.
Bien sûr, out
et ref
de mots clés faire sens pour les primitives et les structures.
Aussi, si je n'envoie pas directement la liste, mais envoyer une classe contenant la liste? (c'est internal
et nécessaire), puis-je encore besoin d'utiliser ref
? ou si je le passe entre les fonctions, ex:
void A(ref LinkedList<int> list){
B(list);
}
void B(ref LinkedList<int> list){
_myList = list;
}
OriginalL'auteur Nefzen | 2009-06-09
Vous devez vous connecter pour publier un commentaire.
Pour ce que vous faites, vous n'avez pas besoin d'utiliser la ref. Si vous avez fait passer la liste à l'aide de ref, vous seriez en permettant à l'appelant pour modifier la liste, vous faites référence, plutôt que de simplement en changeant le contenu de la liste.
OriginalL'auteur Jon B
C'est une idée fausse très répandue de l'utilisation de
ref
mot-clé en C#. Son but est de passer à une valeur ou un type de référence par référence, et vous avez seulement besoin d'elle dans des circonstances spécifiques où vous avez besoin d'une référence directe à l'argument réel, plutôt qu'une copie de l'argument (une valeur de référence ou de lui-même). Il est impératif de ne pas confondre types de référence avec le passage par référence en tout cas.Jon Skeet a écrit un excellent article sur la transmission de paramètres en C#, qui compare la valeur des types, des types de référence, en passant par valeur, le passage par référence (
ref
), et les paramètres de sortie (out
). Je vous recommande de prendre le temps de lire à travers ce en plein et de votre compréhension devrait devenir beaucoup plus clair.De citer les parties les plus importantes de la page:
Valeur des paramètres:
Des paramètres de référence:
De conclure: lecture de ma réponse et Jon Skeet de l'article, j'espère que vous verrez alors qu'il est pas besoin que ce soit pour l'utilisation de la
ref
mot-clé dans le contexte de votre question.Vous a donné l'impression contraire... que voulez-vous dire, et comment?
J'ai eu l'impression que l'envoi d'une classe par valeur va appeler le constructeur de copie, parce que c'est copié "par valeur". Qui fait encore moins de sens sans besoin que ce soit pour utiliser
ref
, donc j'ai le droit de réponse à la fin.Passage d'une classe par valeur t copier la valeur. La clé ici est que la "valeur" est en fait un référence à l'objet -alors, vous êtes vraiment juste de créer une nouvelle référence qui pointe vers le même objet (type de référence) sur le tas.
Et ne vous inquiétez pas, je vous en vouloir pour l'acceptation de l'autre réponse! 😉
OriginalL'auteur Noldorin
Le seul moment où vous devez utiliser la ref avec un type de référence est si vous avez l'intention de créer un nouvel objet à l'intérieur d'une fonction.
Exemple #1:
ref
mot-clé n'est pas nécessaire.Exemple #2:
ref
mot-clé nécessaire.Fixe. Merci. 🙂
Votre explication fait solide comme le roc pour moi. Merci
OriginalL'auteur Spencer Ruport
Dans les deux extraits que vous avez posté, il n'est pas nécessaire de passer par la liste réf. Pour citer Jon Skeet, les références de l'objet sont passés par valeur. Cela signifie, que vous souhaitez ref un type de référence lorsque la méthode seront ou pourraient changer la référence de l'objet et que vous souhaitez que cette nouvelle référence pour effectuer retour à l'appel de la méthode. Par exemple:
OriginalL'auteur Timothy Carter
Je suis l'ajout de cette réponse pour les programmeurs qui sont utilisés pour le C++, comme moi.
Des Classes, des interfaces, delegatess et les tableaux sont
reference types
, ce qui signifie qu'ils ont sous-jacente d'un pointeur. Normal appels de la fonction de copie de ce pointeur(de référence), en valeur, tout en envoyant par référence envoie envoie une référence à cette référence:Primitives telles que int, double, etc les structures et les chaînes de caractères(string sont une exception, mais fonctionne de manière similaire), sont allouées sur le tas, de sorte que les choses fonctionnent un peu différent:
la
ref
mot-clé doit être utilisé à la fois dans la déclaration de la méthode et lors de l'appel, de sorte qu'il serait clair qu'il est référencé:Comme l'a dit avant, veuillez lire cette explication détaillée. Il explique également à propos des chaînes.
Il est intéressant de noter que l'appel par les ouvrages de référence d'un pointeur, donc nous arrivons à ce code:
c'est un équivalent, mais c'est un peu vrai.
OriginalL'auteur Nefzen
Non, vous n'avez pas besoin d'utiliser réf.
LinkedList est un objet, il est donc déjà un type de référence. Le paramètre
list
est une référence à la LinkedList objet.Voir ce Article MSDN pour une description des types de valeur. Types de valeur sont généralement les paramètres, vous devez utiliser la
ref
ouout
avec les mots-clés.Vous pouvez également passer des types de référence par
ref
. Cela vous permettra de point de référence à un autre objet.Tout moment, vous passez d'un
object o
vous êtes vraiment passer une référence à l'objet. Lorsque vous passez un `réf objet o' vous êtes de passage à une référence à la référence. Cela vous permet de modifier la référence.En Passant De Référence-Les Paramètres De Type peut également vous aider à comprendre.
C'est en fait plus qu'un peu trompeur. Le "ref" mot-clé n'a rien à voir avec le fait que c'est un type de référence. Il est utilisé pour être en mesure de modifier la référence qui est passé.
Merci pour les remarques, je vais essayer de préciser que, dans le texte.
Eh bien, cela dépend de comment vous avez interprété la déclaration. C'était assez vague, donc il y a beaucoup de portée. J'étais probablement être gentil avec le "un peu". En effet, l'utilisation de
ref
et les types référence est complètement indépendant, comme je l'explique dans ma réponse.En effet, c'est extermely trompeuse. "Non, vous n'avez pas besoin d'utiliser la réf. C'est déjà un type de référence." implique que le mot-clé ref ne fait rien lorsqu'il est utilisé avec les types de référence et ne doivent jamais être utilisés. C'est une mauvaise réponse dans mon esprit.
OriginalL'auteur dss539
Je sais que c'est une vieille question, mais aucune des réponses donner une bonne raison à mon avis.
Vous n'avez pas besoin d'utiliser
ref
dans ce cas, et voici pourquoi. Prenons cette fonction:Maintenant appeler cette fonction en tant que
Voici ce que vous obtenez à l'intérieur de la fonction:
Choses importantes à réaliser:
a1
ànull
sera pas ensemblea
ànull
.a2
ànull
sera misa
ànull
.b1
est nécessaire.c1
sera pas changementc
.d1
sera pas changementd
.d2
va changerd
.Cela permet de "bizarre" comme ceci:
Appelé comme:
Vous utilisez une classe, et donc votre situation est plus variable
a1
dans l'appel de fonction. Ce qui signifieref
n'est pas strictement nécessaire.Jon Skeet article ne vous aidera pas beaucoup, parce que son exemple avec
IntHolder
est unstruct
pas unclass
.Struct
est le type de valeur commeint
et doivent être traitées de la même manière.OriginalL'auteur bueller