web-dev-qa-db-fra.com

Quelle est la différence entre les paramètres "var" et "out"?

Quelle est la différence entre les paramètres déclarés avec var et ceux déclarés avec out? Comment le compilateur les traite-t-il différemment (par exemple, en générant un code différent ou en modifiant les diagnostics qu'il émet)? Ou les différents modificateurs permettent-ils simplement au programmeur de documenter l'utilisation prévue des paramètres? Quel effet les types des paramètres ont-ils sur la question?

55
Rob Kennedy

Un paramètre var sera passé par référence, et c'est tout.

Un paramètre out est également transmis par référence, mais il est supposé que la valeur d'entrée n'est pas pertinente. Pour les types gérés (chaînes, interfaces, etc.), le compilateur appliquera cela, en effaçant la variable avant le début de la routine, ce qui équivaut à écrire param := nil. Pour les types non gérés, le compilateur implémente out de manière identique à var.

Notez que la suppression d'un paramètre géré est effectuée sur le site d'appel et que le code généré pour la fonction ne varie pas avec les paramètres out ou var.

46
Mason Wheeler

Il n'y a pas beaucoup de différence pour le compilateur. Voir réponse de Mason pour cela.

Sémantiquement, il y a une grande différence:

  • var indique au programmeur que la routine pourrait fonctionner avec sa valeur actuelle,
  • out indique au programmeur que la routine ignorera/rejetera sa valeur actuelle.
8
NGLN

Un peu tard mais juste pour mémoire, je suis tombé sur un cas où var ou out a fait une grande différence.

Je travaillais sur un service Web SOAP qui exportait la méthode suivante:

function GetUser( out User :TUser ) :TResult;

qui devenait importé dans C # comme l'équivalent de

function GetUser( out Result :TResult) :TUser;

quand j'ai changé le out en var il l'a importé correctement.

Je suppose que le Delphi SOAP invoker traite le résultat de la fonction comme un paramètre out et que le fait d'avoir deux paramètres out confond le Delphi = SOAP routines. Je ne sais pas s'il existe une solution de contournement pour vous permettre d'utiliser les paramètres out.

1
Steve