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




(12)

Quelle est la différence entre out paramètres ref et 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'on peut être utilisé et un autre ne peut pas?


Paramètres Ref et Out:

Les paramètres out et ref sont utilisés pour renvoyer des valeurs dans la même variable, que vous passez en argument d'une méthode. Ces deux paramètres sont très utiles lorsque votre méthode doit renvoyer plusieurs valeurs.

Vous devez affecter une valeur au paramètre out dans le corps de la méthode calee, sinon la méthode ne sera pas compilée.

Ref Parameter: Il doit être initialisé avant de passer à la méthode. Le mot-clé ref sur un paramètre de méthode fait référence à une méthode qui fait référence à la même variable qui a été transmise en tant que paramètre d'entrée pour la même méthode. Si vous faites des changements à la variable, ils seront reflétés dans la variable.

int sampleData = 0; 
sampleMethod(ref sampleData);

Ex de paramètre Ref

public static void Main() 
{ 
 int i = 3; // Variable need to be initialized 
 sampleMethod(ref i );  
}

public static void sampleMethod(ref int sampleData) 
{ 
 sampleData++; 
} 

Out Parameter: Il n'est pas nécessaire d'être initialisé avant de passer à Method. Le paramètre out peut être utilisé pour renvoyer les valeurs de la même variable passée en paramètre de la méthode. Toute modification apportée au paramètre sera reflétée dans la variable.

 int sampleData; 
 sampleMethod(out sampleData);

Ex de Out Parameter

public static void Main() 
{ 
 int i, j; // Variable need not be initialized 
 sampleMethod(out i, out j); 
} 
public static int sampleMethod(out int sampleData1, out int sampleData2) 
{ 
 sampleData1 = 10; 
 sampleData2 = 20; 
 return 0; 
} 

en dehors:

En C #, une méthode peut retourner une seule valeur. Si vous souhaitez renvoyer plusieurs valeurs, vous pouvez utiliser le mot clé out. Le modificateur out renvoie le retour par référence. La réponse la plus simple est que le mot clé "out" est utilisé pour obtenir la valeur de la méthode.

  • Vous n'avez pas besoin d'initialiser la valeur dans la fonction appelante.
  • Vous devez affecter la valeur à la fonction appelée, sinon le compilateur signale une erreur.

ref:

En C #, lorsque vous transmettez un type de valeur tel que int, float, double etc. en tant qu'argument au paramètre method, il est passé par valeur. Par conséquent, si vous modifiez la valeur du paramètre, cela n'affecte pas l'argument dans l'appel de méthode. Mais si vous marquez le paramètre avec le mot-clé "ref", il reflétera dans la variable réelle.

  • Vous devez initialiser la variable avant d'appeler la fonction.
  • Il n'est pas obligatoire d'affecter une valeur au paramètre ref dans la méthode. Si vous ne changez pas la valeur, quel est le besoin de la marquer comme "ref"?

Ils sont à peu près les mêmes - la seule différence est qu'une variable que vous transmettez en tant out paramètre out n'a pas besoin d'être initialisée mais en la passant comme paramètre ref , elle doit être définie sur quelque chose.

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

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

Ref paramètres Ref sont pour les données qui peuvent être modifiées, out paramètres out sont pour les données qui sont une sortie supplémentaire pour la fonction (par exemple int.TryParse ) qui utilisent déjà la valeur de retour pour quelque chose.


Ils sont subtilement différents.

Un paramètre out n'a pas besoin d'être initialisé par l'appelé avant d'être passé à la méthode. Par conséquent, toute méthode avec un paramètre out

  • Impossible de lire le paramètre avant de lui affecter une valeur
  • Doit lui attribuer une valeur avant de retourner

Ceci est utilisé pour une méthode qui doit écraser son argument indépendamment de sa valeur précédente.

Un paramètre ref doit être initialisé par l'appelé avant de le passer à la méthode. Par conséquent, toute méthode avec un paramètre ref

  • Peut inspecter la valeur avant de l'affecter
  • Peut retourner la valeur d'origine, intacte

Ceci est utilisé pour une méthode qui doit (par exemple) inspecter sa valeur et la valider ou la normaliser.


Les paramètres de référence ne doivent pas être définis dans la fonction, tandis que les paramètres de sortie doivent être liés à une valeur avant de quitter la fonction. Les variables passées comme out peuvent également être passées à une fonction sans être initialisées.


Lorsqu'un paramètre out est déclaré dans la déclaration de la méthode, le corps de la méthode doit affecter une valeur à la variable out avant de la renvoyer. Il est donc de la responsabilité de la méthode appelée d'affecter la valeur au paramètre out avant son retour.

Quand un paramètre ref est déclaré dans la méthode, l'argument passé en invoquant la méthode devrait avoir assigné la valeur. Il est donc de la responsabilité de l'appelant d'assigner la valeur de l'argument ref avant d'appeler la méthode.



out et ref sont exactement les mêmes à l'exception que les variables out n'ont pas besoin d'être initialisées avant de les envoyer dans l'abysse. Je ne suis pas si intelligent, je l'ai criblé de la bibliothèque MSDN :).

Pour être plus explicite quant à leur utilisation, cependant, la signification du modificateur est que si vous changez la référence de cette variable dans votre code, out et ref feront que votre variable appelante changera également de référence. Dans le code ci-dessous, la variable ceo sera une référence au newGuy une fois qu'il reviendra de l'appel à doStuff. Si ce n'était pas pour ref (ou out) la référence ne serait pas modifiée.

private void newEmployee()
{
    Person ceo = Person.FindCEO();
    doStuff(ref ceo);
}

private void doStuff(ref Person employee)
{
    Person newGuy = new Person();
    employee = newGuy;
}

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

L'appelant d'une méthode qui prend un paramètre out n'est pas obligé d'affecter à la variable transmise comme paramètre out avant l'appel; cependant, l'appelé doit assigner au paramètre out avant de revenir.

En revanche, les paramètres ref sont considérés initialement attribués par l'appelant. En tant que tel, l'appelé n'est pas obligé d'affecter le paramètre ref avant utilisation. Les paramètres Ref sont passés à la fois dans et hors d'une méthode.

Donc, out signifie out, tandis que ref est pour in et out.

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


out paramètres out sont initialisés par la méthode appelée, les paramètres ref sont initialisés avant d'appeler la méthode. Par conséquent, out paramètres out sont utilisés lorsque vous avez juste besoin d'une valeur de retour secondaire, les paramètres ref sont utilisés pour obtenir une valeur et potentiellement retourner une modification à cette valeur (secondairement à la valeur de retour principale).


ref et out permettent à la méthode appelée de modifier un paramètre. La différence entre eux est ce qui se passe avant de faire l'appel.

  • ref 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 à tout moment. Le paramètre entre, puis sort

  • out signifie que le paramètre n'a aucune valeur officielle avant d'entrer dans la fonction. La fonction appelée doit l'initialiser. Le paramètre ne s'éteint que

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 une valeur de retour secondaire pour 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 alternative:

Avant d'appeler la méthode:

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

out : La méthode caller 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 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 télécommandés:

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

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

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


Le paramètre Out et ref en C # a de bons exemples.

La différence fondamentale décrite est que out paramètres out n'ont pas besoin d'être initialisés lorsqu'ils sont transmis, contrairement aux paramètres ref.





.net