113 votes

Existe-t-il un moyen de ne pas s'embarrasser d'un paramètre out en c #?

Je passe un appel:

 myResult = MakeMyCall(inputParams, out messages);
 

mais je ne me soucie pas vraiment des messages. Si c'était un paramètre d'entrée qui ne m'intéressait pas, je passerais simplement un null. Si c'était le retour dont je me fichais, je le laisserais simplement.

Existe-t-il un moyen de faire quelque chose de similaire avec un out ou dois-je déclarer une variable que je vais ignorer?

38voto

Jon Skeet Points 692016

Vous devez déclarer une variable qui vous permettra ensuite de les ignorer. Ceci est le plus souvent le cas avec les TryParse (ou TryWhatever) modèle, lorsqu'il est utilisé pour tester la validité de la saisie de l'utilisateur (par exemple, peut-il être analysé comme un numéro?) sans se soucier de la réelle valeur analysée.

Vous avez utilisé le mot "jeter" dans la question, ce qui je pense est juste dommage - mais si le paramètre de sortie est d'un type qui implémente IDisposable, vous devriez certainement Jeter à moins que la documentation de la méthode stipule explicitement que la réception de la valeur ne doit pas conférer la propriété. Je ne me souviens pas avoir déjà vu une méthode avec un jetable out paramètre si, donc je suis en espérant que ce n'était qu'un malheureux choix de mots.

37voto

Andrew Hare Points 159332

Malheureusement, vous êtes tenus de passer quelque chose parce que la méthode est nécessaire pour le régler. Si vous ne pouvez pas envoyer des null parce que la méthode, étant nécessaire pour le définir, ferait exploser.

Une approche pour cacher la laideur serait pour envelopper la méthode dans une autre méthode qui ne l' out paramètre de la sorte:

String Other_MakeMyCall(String inputParams)
{
	String messages;

	return MakeMyCall(inputParams, out messages);
}

Ensuite, vous pouvez appeler Other_MakeMyCall sans avoir à tripoter out paramètres que vous n'avez pas besoin.

11voto

bmm6o Points 2692

Si la fonction d'origine est déclarée comme ceci:

 class C
{
    public Result MakeMyCall(Object arg, out List<String> messages);
}
 

Vous pouvez déclarer une méthode d'extension comme ceci:

 static class CExtension
{
    public static Result MakeMyCall(this C obj, Object arg)
    {
        List<String> unused;
        return obj.MakeMyCall(arg, out unused);
    }
}
 

La méthode d'extension se comportera comme une surcharge qui rend le paramètre out facultatif.

4voto

Jonathan Allen Points 23540

Pour ce faire, le compilateur Visual Basic crée une variable factice. C # pourrait le faire, si vous pouvez convaincre Microsoft que c'est une bonne idée.

0voto

Sören Kuklau Points 9445

Si la classe de messages implémente IDisposable , vous ne devriez pas l'ignorer. Considérons quelque chose comme l'approche suivante (la syntaxe n'est peut-être pas correcte car je n'ai pas écrit C # depuis un moment):

 using (FooClass messages) {
    myResult = MakeMyCall(inputParams, messages);
}
 

Une fois en dehors du bloc using , messages sera automatiquement éliminé.

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