Pourquoi C # a-t-il à la fois out et ref?

18

C # a outet refmots - clés. Pourquoi ces deux nécessaires? Avertissement: je n'ai pas une connaissance approfondie de C #.

Néo
la source
3
N'y a-t-il pas un doublon intersite sur Stack Overflow?
Peter Mortensen
2
Demandez-vous la différence entre refet out? Ou demandez-vous quelle est l'utilisation des arguments par référence ref/ outpar rapport aux arguments par valeur (pas de modification du paramètre)? Ou les deux?
Jeppe Stig Nielsen
1
Je pense que cette question est similaire, mais pas tout à fait dup - au moins si elle est prise du point de vue de la conception du langage
jmoreno

Réponses:

32

En termes d'implémentation, ils sont essentiellement la même chose, mais outcommuniquent quelque chose qui refne le fait pas: vous ne vous souciez pas de l'entrée. Cela signifie certaines choses pour vous et pour l'outillage. Par exemple, vous pouvez passer une variable non initialisée à un outparamètre et ce n'est pas un problème, sinon ce serait le cas, et dans la fonction, vous devez attribuer une valeur au outparamètre avant qu'il ne revienne, alors qu'il n'y a aucune obligation de faire quoi que ce soit à le tout avec une refvaleur.

Mason Wheeler
la source
10
Réf vs out est beaucoup plus important pour le compilateur que d'un programmeur. Le compilateur est obligé de vous assurer que vous ne lisez pas une variable avant qu'il ne se voit attribuer une valeur, et outil donne un moyen de le faire , qui permet une meilleure adéquation la façon dont vous voulez traiter avec des variables , en premier lieu.
Ammon Cort - Rétablir Monica
Pourriez-vous s'il vous plaît expliquer: «out» communique quelque chose que «ref» ne fait pas.
Neo
4
@Neo: Fondamentalement, ce que j'ai dit dans la réponse: cela communique que vous ne vous souciez pas de l'utiliser pour la saisie, et donc il est sûr de passer une valeur non initialisée à un outparamètre car la fonction qui la reçoit ne va pas la lire .
Mason Wheeler du
@MasonWheeler Est - ce permis (et / ou appliquée à l'extrémité de réception) par le vérificateur, si? Out est tout simplement un attribut, à l' intérieur.
Random832
@ Random832: Comme Robert l'a posté sous sa réponse, jetez un œil à Eric Lippert (ancien gars du compilateur C #) en discutant à stackoverflow.com/q/2876315
Mason Wheeler
7

Pour comprendre ces deux mots - clés, vous aurez besoin de comprendre ce que le passage d' une valeur de référence moyen. Essentiellement , cela signifie que, si vous modifiez la variable de paramètres que vous passez dans la méthode ou la fonction, cette variable conserve sa valeur modifiée quand vous sortez de fonction. La déclaration refou l' outaccomplissement d' un paramètre , alors qu'une variable de paramètre ordinaire conserverait sa valeur d'origine, même si vous l'avez modifié dans la fonction.

Les seules différences entre refet outest que outne vous oblige pas à initialiser la variable avant de passer dans la fonction, mais refne; en out fait vous avez besoin d'attribuer quelque chose à la variable au sein de la fonction, mais refne fonctionne pas.

Robert Harvey
la source
N'y at - il une différence liée à la variance?
MonoCell
Voir la réponse de Eric Lippert sur stackoverflow.com/q/2876315
Robert Harvey
2

Tu as demandé.

C # ont dehors et ref, pourquoi ces deux sont obligatoires. Je ne suis pas au courant de la profondeur de C #. Pourquoi paramètres sur et ref sont nécessaires?

Et la réponse est qu'ils ne sont pas tenus, Java, par exemple, ne pas non plus et VB ne dispose que d'arbitre (et il faut que dans la déclaration de méthode).

Vous pouvez facilement écrire un programme complet sans utiliser non plus.

Ils existent parce qu'ils sont parfois pratique. Quelle est la raison pour laquelle il y a deux d'entre eux et pas seulement un - parce qu'il est utile de faire la distinction entre « ici est quelque chose, modifiez-le si vous voulez » et «donner cette chose une nouvelle valeur.

D'autres langues ont des priorités différentes et peuvent donc ou non les inclure ou leur équivalent. Ils peuvent même en désaccord si non est utile, et ainsi peut décider activement de ne pas mettre en place un ou l'autre.

jmoreno
la source
1

À la fois ref, ils outfournissent un mécanisme pour transmettre l'adresse d'une variable à une méthode afin qu'elle puisse être mise à jour - l'affectation au paramètre refou outmet à jour la variable dans le contexte de l'appelant. Ces chercheurs se distinguent dans les garanties: outgarantir que la variable est mise à jour, refne fonctionne pas.

De l'autre côté de l'appel, il existe des différences similaires. Un outparamètre à notre méthode n'est pas garanti pour contenir quelque chose d' utile à l' arrivée et doit être réglé sur une valeur à un moment donné, alors qu'un refparamètre peut être censé avoir une valeur et nous ne particulier pas besoin de quoi que ce soit là- dedans.

Cette différence a des impacts sur l 'analyse de code, la production et l'optimisation lequel, alors que pas très évident pour nous la plupart des cas, peut avoir des effets sur la manière dont nos programmes finissent exploitation. Le générateur de code peut différer l'allocation de la variable jusqu'à immédiatement avant l'appel, l'optimiseur peut décider qu'il peut réorganiser certaines opérations plus efficacement en fonction du contrat, etc.

En termes d'utilisation: en règle générale , j'utilise dans outdes situations où je ne me soucie pas du contenu de la variable quand il arrive un paramètre et refquand je fais.

Corey
la source