410 votes

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

Quelle est la différence entre ref y out dans .NET ? Quelles sont les situations où l'un peut être plus utile que l'autre ? Quel serait un extrait de code où l'un peut être utilisé et pas l'autre ?

0 votes

A mon avis, ce n'est pas un duplicata de la question mentionnée parce que 1. il a précédé cette question 2. il y a des détails dans cette question qui ne sont pas liés au "duplicata".

507voto

Khoth Points 7001

C'est à peu près la même chose - la seule différence est qu'une variable que vous passez comme un out n'a pas besoin d'être initialisé, mais le fait de le passer en tant que paramètre ref il doit être réglé sur quelque chose.

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error: y should be initialized before calling the method

Ref Les paramètres sont destinés aux données susceptibles d'être modifiées, out Les paramètres sont pour les données qui sont une sortie supplémentaire pour la fonction (ex. int.TryParse ) qui utilisent déjà la valeur de retour pour quelque chose.

101 votes

De plus, les paramètres out doivent être définis pendant l'exécution du callee avant de revenir à l'appelant, ce qui s'oppose à ref, qui doit être défini par l'appelant avant d'appeler le callee.

3 votes

@Mike Votre correction est erronée. C'était bien "et la méthode utilisant le out Le paramètre doit être réglé sur quelque chose." Une méthode recevant un out doit l'initialiser. Une méthode recevant un ref le paramètre peut lui faire ce qu'il veut. Il peut sûrement l'ignorer. Je fais marche arrière.

2 votes

La principale différence est que les ref sont in et out alors que out ne peut être utilisé que pour retourner des données. Considérons void works(ref int z) { Debug.WriteLine(z) ; } et void notWorks(out int z) { Debug.WriteLine(z) ; } ou est-ce que je rate une astuce pour obtenir la valeur d'un paramètre out avant qu'il ne soit initialisé ? J'ai remarqué que le débogueur peut le faire, par exemple.

133voto

Derek Park Points 25025

Pourquoi le C# possède-t-il à la fois "ref" et "out" ?

L'appelant d'une méthode qui prend un paramètre out n'est pas tenu d'assigner à la variable passée comme paramètre out avant l'appel ; cependant, l'appelé est tenu d'assigner au paramètre out avant de retourner.

En revanche, les paramètres ref sont considérés comme initialement assignés par l'appelant. En tant que tel, le destinataire n'est pas tenu d'assigner le paramètre ref avant de l'utiliser. Les paramètres ref sont passés à la fois dans et hors d'une méthode.

Donc, out signifie sortie, tandis que ref est pour les entrées et les sorties.

Ceux-ci correspondent étroitement aux [out] y [in,out] paramètres des interfaces COM, les avantages de out Les paramètres étant que les appelants n'ont pas besoin de passer un objet pré-alloué dans les cas où il n'est pas nécessaire à la méthode appelée - ceci évite à la fois le coût de l'allocation, et tout coût qui pourrait être associé au marshaling (plus probable avec COM, mais pas rare en .NET).

3 votes

"In contrast ref parameters are considered initially assigned by the callee", vous vouliez sûrement dire "caller". J'ai essayé d'éditer votre réponse mais il ne me laisse pas sauvegarder une modification aussi mineure.

0 votes

Le lien contient une explication très claire de la différence, meilleure que la plupart des réponses ici. Merci !

85voto

Euro Micelli Points 12845

ref y out permettent toutes deux à la méthode appelée de modifier un paramètre. La différence entre les deux est ce qui se passe avant vous passez l'appel.

  • ref signifie que le paramètre a une valeur avant dans la fonction. La fonction appelée peut lire et/ou modifier la valeur à tout moment. Le paramètre entre, puis sort

  • 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 sort que

Voici ma façon préférée de voir les choses : ref est de passer les variables par référence. out est de déclarer une valeur de retour pour la fonction. C'est comme si tu pouvais écrire ça :

// 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 alternative :

Avant d'appeler la méthode :

ref : L'appelant doit définir la valeur du paramètre avant de le transmettre à la méthode appelée.

out : La méthode appelante n'est pas tenue de définir la valeur de l'argument avant d'appeler la méthode. Le plus souvent, vous ne devriez pas. En fait, toute valeur actuelle est rejetée.

Pendant l'appel :

ref : La méthode appelée peut lire l'argument à tout moment.

out : La méthode appelée doit initialiser le paramètre avant de le lire.

Appels à distance :

ref : La valeur courante est marshallée à l'appel distant. Coût de performance supplémentaire.

out : Rien n'est transmis à l'appel distant. Plus rapide.

Techniquement parlant, vous pourriez utiliser toujours ref à la place de out mais out vous permet d'être plus précis sur le sens de l'argument, et parfois il peut être beaucoup plus efficace.

1 votes

La ligne mentionnée comme "Ceci n'est pas du C#" est maintenant effectivement du C# à partir de C# 7 docs.microsoft.com/fr/us/dotnet/csharp/whats-new/

19voto

Exemple pour OUT : La variable reçoit une valeur initialisée après être entrée dans la méthode. Plus tard, la même valeur est renvoyée à la méthode principale.

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            // u can try giving int i=100 but is useless as that value is not passed into
            // the method. Only variable goes into the method and gets changed its
            // value and comes out. 
            int i; 

            a.abc(out i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(out int i)
        {

            i = 10;

        }

    }
}

Sortie :

10

\===============================================

Exemple pour Ref : La variable doit être initialisée avant d'entrer dans la méthode. Plus tard, la même valeur ou une valeur modifiée sera retournée à la méthode principale.

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            int i = 0;

            a.abc(ref i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(ref int i)
        {
            System.Console.WriteLine(i);
            i = 10;

        }

    }
}

Sortie :

    0
    10

\=================================

J'espère que c'est clair maintenant.

10voto

Brian R. Bondy Points 141769
  • A ref doit être initialisée avant de la transmettre.
  • Un site out doit être définie dans l'implémentation de votre fonction
  • out les paramètres peuvent être considérés comme des variables de retour supplémentaires (pas d'entrée)
  • ref Les paramètres peuvent être considérés comme des variables d'entrée et de sortie.

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