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