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 est l'effet des types de paramètres sur le sujet?
Réponses
Trop de publicités?Un var
paramètre est passé par référence, et c'est tout.
Un out
paramètre est passé par référence, mais il est supposé que la valeur d'entrée est hors de propos. Pour les types gérés, les cordes, les Interfaces, etc,) le compilateur s'appliquer ceci, en compensation de la variable avant de la routine commence, équivalent à l'écriture param := nil
. Pour les types non gérés, le compilateur implémente out
identique à var
.
Note que le centre de la gestion du paramètre est effectuée à l'appel du site et donc le code généré pour la fonction ne varie pas avec l' out
ou var
paramètres.
Il n'y a pas beaucoup de différence pour le compilateur. Voir la 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 / supprimera sa valeur actuelle.
Un peu en retard mais juste pour le record, je suis tombé sur un cas où var ou out fait une grande différence.
Je travaillais sur un web service SOAP qui a exporté la méthode suivante:
function GetUser( out User :TUser ) :TResult;
en plus importés en C# comme l'équivalent de
function GetUser( out Result :TResult) :TUser;
quand j'ai changé le sort d'un var il importées correctement.
Je devine que le Delphi SAVON invocateur traite le résultat de la fonction comme un out paramètre et que le fait d'avoir deux hors des paramètres confond le Delphi SAVON routines. Je ne sais pas si il y a une solution pour vous permettre de l'utiliser hors de paramètres.