60 votes

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 est l'effet des types de paramètres sur le sujet?

54voto

Mason Wheeler Points 52022

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.

13voto

NGLN Points 25671

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.

2voto

Steve Points 1241

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.

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