Quelle est la différence entre ref
et out
paramètres .NET? Quelles sont les situations où l'on peut être plus utile que les autres? Ce serait un fragment de code où l'on peut être utilisé et l'autre pas?
Réponses
Trop de publicités?Ils sont à peu près la même - la seule différence est qu'une variable passé en out
paramètre n'a pas besoin d'être initialisé, et la méthode à l'aide de l' out
paramètre a de le régler pour quelque chose.
int x;
Foo(out x); // OK
int y;
Foo(ref y); // Error
Ref
sont des paramètres pour les données qui peuvent être modifiées, out
sont des paramètres pour les données c'est une sortie supplémentaire pour la fonction (par exemple, int.TryParse
) qui sont déjà à l'aide de la valeur de retour pour quelque chose.
Pourquoi est-ce que C# ont à la fois " ref " et "out"?
L'appelant d'une méthode qui prend un paramètre de sortie n'est pas nécessaire d'affecter à la variable passée en tant que paramètre de sortie avant l'appel; toutefois, le destinataire de l'appel est nécessaire pour attribuer au paramètre de sortie avant de revenir.
En revanche ref paramètres sont pris en compte initialement affecté par le destinataire de l'appel. En tant que tel, le destinataire de l'appel n'est pas nécessaire d'attribuer au paramètre de référence avant de l'utiliser. Ref paramètres sont transmis à la fois dans et hors d'une méthode.
Donc, out
signifie que, tout en ref
est pour dans et hors.
Ceux-ci correspondent étroitement à l' [out]
et [in,out]
paramètres des interfaces COM, les avantages de l' out
paramètres étant que les appelants n'ont pas besoin de passer une pré-alloués objet dans les cas où il n'est pas nécessaire par la méthode appelée - ce qui évite à la fois le coût de l'allocation, et tous les coûts qui pourraient être associés à de regroupement (la plus probable avec COM, mais il n'est pas rare .NET).
[ref] et [out] permettent à la fois la méthode appelée pour modifier un paramètre. La différence entre eux est ce qui se passe avant de vous rendre à l'appel.
[réf] signifie que le paramètre a une valeur avant d' entrer dans la fonction. La fonction appelée peut lire et ou modifier la valeur en tout temps. Le paramètre va en, sort alors
[out] signifie que le paramètre n'a pas de valeur officielle avant d'entrer dans la fonction. La fonction appelée doit l'initialiser. Le paramètre ne s'éteint
Voici ma façon préférée de le regarder: [ref] est de passer des variables par référence. [out] est de déclarer un secondaire de la valeur de retour de la fonction. C'est comme si vous pouviez écrire ceci:
// This is not C#
public (bool, string) GetWebThing(string name, [ref] Buffer paramBuffer);
// This is C#
public bool GetWebThing(string name, [ref] Buffer paramBuffer, [out] string actualUrl);
Voici une liste plus détaillée des effets de chaque option:
Avant d'appeler la méthode:
[réf]: L'appelant doit définir la valeur du paramètre avant de passer à la méthode appelée.
[out]: L'appelant de la méthode n'est pas nécessaire pour définir la valeur de l'argument avant d'appeler la méthode. Très probablement, vous ne devriez pas. En fait, toute valeur actuelle est supprimée.
Lors de l'appel:
[réf]: La méthode appelée pouvez lire l'argument à tout moment.
[out]: La méthode appelée doit initialiser le paramètre avant de le lire.
Distants d'appels:
[réf]: La valeur actuelle est rassemblée à l'appel distant. Un surcroît de performance de coût.
[out]: Rien n'est passé à l'appel distant. Plus rapide.
Techniquement parlant, vous pouvez toujours utiliser [ref] au lieu de [], mais [out] vous permet d'être plus précis sur le sens de l'argument, et parfois, il peut être beaucoup plus efficace.
- Un
ref
variable doit être initialisée avant de le transmettre. - Un
out
variable doit être mis dans votre implémentation de la fonction out
paramètres peuvent être considérés comme de retour supplémentaire variables (pas d'entrée)ref
paramètres peuvent être considérés comme à la fois d'entrée et de sortie des variables.