403 votes

Différence entre ref et out paramètres dans .NET

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?

495voto

Khoth Points 7001

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.

130voto

Derek Park Points 25025

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).

83voto

Euro Micelli Points 12845

[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.

10voto

Brian R. Bondy Points 141769
  • 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X