Oui - la différence entre ref
et out
est en termes d'affectation précise:
Un paramètre out
n'a pas doivent être définitivement attribué par l'appelant avant l'appel de méthode. Il doit être définitivement affecté dans la méthode avant qu'il ne retourne normalement (c'est-à-dire sans exception). La variable est alors définitivement affectée dans l'appelant après l'appel.
Un paramètre doit être définitivement affecté par l'appelant avant l'appel de méthode. Il ne doit pas être affecté une valeur différente dans la méthode.
Nous voulions supposer changer int.TryParse(string, out int)
utiliser ref
à la place. Habituellement, le code d'appel ressemble à ceci:
int value;
if (int.TryParse(text, out value))
{
// Use value
}
else
{
// Do something else
}
Maintenant, si nous avons utilisé ref
, nous aurions dû donner value
une valeur avant l'appel, par exemple:
int value = 0;
if (int.TryParse(text, ref value))
{
// Use value
}
else
{
// Do something else
}
Il est évident que ce n'est pas un énorme différence - mais cela donne une mauvaise impression. Nous assignons une valeur que nous n'avons jamais l'intention d'utiliser, et ce n'est pas une bonne chose pour la lisibilité. Un paramètre out
indique qu'une valeur sortira de la méthode (en supposant qu'il n'y a pas d'exception) et que vous n'avez pas besoin d'avoir une valeur pour commencer. Une fois des suggestions que j'ai faites pour C# 5 (je ne sais pas si elle sera prise ou non) est qu'une méthode avec un paramètre out
devrait être considérée comme une méthode retournant un tuple des valeurs. Combiné avec un meilleur soutien pour tuples, cela signifierait que nous pourrions faire quelque chose comme ceci:
var (ok, value) = int.TryParse(text);
Dans ce cas ok
et value
serait tapé implicitement bool
et int
respectivement. De cette façon, il est clair ce qui se passe dans la méthode (text
) et ce qui sort (deux informations: ok
et value
).
Ce serait tout simplement pas disponible si int.TryParse
utilisé un paramètre ref
à la place - comme le compilateur ne peut pas savoir s'il va effectivement soin de la valeur initiale du paramètre ref
.
NB: Je viens de poster [cette réponse] (http://stackoverflow.com/questions/4102892/real-world-examples-where-c-out-parameters-are-useful/7220754#7220754) pour une question similaire où je décris un scénario où un paramètre 'out' est utile pour autre chose que de renvoyer plus d'une valeur d'une méthode. – stakx