51 votes

Quand devrais-je utiliser les paramètres?

Je ne comprends pas quand un paramètre de sortie doit être utilisé, je personnalise personnellement le résultat dans un nouveau type si je dois renvoyer plusieurs types, je trouve qu'il est beaucoup plus facile de travailler qu'avec out.

J'ai vu une méthode comme celle-ci,

    public void Do(int arg1, int arg2, out int result)
 

Existe-t-il des cas où cela a du sens?

que diriez-vous de TryParse , pourquoi ne pas renvoyer un type ParseResult ? ou dans le nouveau cadre retourner un type null-capable?

27voto

jasonh Points 7284

Est bon lorsque vous avez un TryNNN de la fonction, et il est clair que le paramètre sera toujours ensemble, même si la fonction ne pas réussir. Cela vous permet de vous baser sur le fait que la variable locale vous déclarez sera mis plutôt que d'avoir à vérifier ultérieurement dans votre code par rapport à la valeur null. (Un commentaire ci-dessous indique que le paramètre peut être réglé en null, de sorte que vous pouvez vérifier la documentation de la fonction que vous appelez pour être sûr si c'est le cas ou pas.) Elle rend le code un peu plus clair et plus facile à lire. Un autre cas est quand vous avez besoin de retourner des données et un statut sur l'état de la méthode comme:

public bool DoSomething(int arg1, out string result);

Dans ce cas, le retour peut indiquer si la fonction a réussi et le résultat est stocké dans le paramètre de sortie. Certes, cet exemple est inventée parce que vous pouvez les concevoir de façon à ce que la fonction renvoie simplement un string, mais vous obtenez l'idée.

Un inconvénient est que vous devez déclarer une variable locale à utiliser:

string result;
if (DoSomething(5, out result))
    UpdateWithResult(result);

Au lieu de:

UpdateWithResult(DoSomething(5));

Cependant, qui peut même ne pas être un désavantage, il dépend de la conception que vous allez pour. Dans le cas de DateTime, les deux moyens (Parse et TryParse) sont fournis.

6voto

Gishu Points 59012

Eh bien, comme avec la plupart des choses, il dépend. Penchons-nous sur les options

  • vous pouviez retourner tout ce que vous voulez que la valeur de retour de la fonction
  • si vous souhaitez retourner plusieurs valeurs ou la fonction a déjà une valeur de retour, vous pouvez soit utiliser params ou créer un nouveau type composite qui expose l'ensemble de ces valeurs en tant que propriétés

Dans le cas de TryParse, en utilisant un param est efficace - vous n'avez pas à créer un nouveau type qui serait 16B de surcharge (sur 32b machines) ou à assumer les perf du coût de l'avoir nettoyée post à l'appel. TryParse pourrait être appelée à partir de l'intérieur d'une boucle, par exemple - si les paramètres de la règle ici.
Pour les fonctions qui ne serait pas appelée dans une boucle (c'est à dire de la performance n'est pas une préoccupation majeure), de retour d'un seul objet composite peut être plus 'propres' (subjective du spectateur). Maintenant, avec les types anonymes et typage Dynamique , il pourrait devenir encore plus facile.

Note:

  1. out params avons quelques règles qui doivent être suivies à savoir le compilateur s'assurer que la fonction ne initialisation de la valeur avant de sortir. Donc TryParse a pour définir le paramètre à une certaine valeur, même si l'opération d'analyse a échoué
  2. Le TryXXX modèle est un bon exemple de cas d'utilisation en dehors params - Int32.TryParse a été introduit coz personnes se sont plaintes de la perf frappé d'attraper les exceptions à savoir si parse échoué. Aussi les plus susceptibles chose que vous feriez en cas d'analyser réussi, est d'obtenir la valeur analysée - à l'aide d'un param signifie que vous n'avez pas à faire un autre appel de méthode pour Analyser

4voto

devuxer Points 15633

Je pense que out est utile pour les situations dans lesquelles vous devez renvoyer à la fois un booléen et une valeur, comme TryParse, mais il serait bien que le compilateur permette quelque chose comme ceci:

 bool isValid = int.TryParse("100", out int result = 0);
 

2voto

CMS Points 315406

Certainement, les paramètres de sortie sont destinés à être utilisés lorsque vous avez une méthode qui doit renvoyer qu'une seule valeur, dans l'exemple que vous avez posté:

public void Do(int arg1, int arg2, out int result)

Il n'a pas fait beaucoup de sens d'utiliser un paramètre de sortie, puisque vous êtes seulement de les retourner une valeur, et que la méthode pourrait être mieux utilisées si vous supprimez le paramètre de sortie et de mettre un int valeur de retour:

public int Do(int arg1, int arg2)

Il y a quelques bonnes choses au sujet de paramètres:

  1. Les paramètres de sortie sont initialement assignés.
  2. Chaque paramètre doit être définitivement attribuées avant le retour de la méthode, votre code ne compilera pas si vous manquez une cession.

En conclusion, en gros, j'ai essayer de l'utilisation params dans mon API privée pour éviter de créer des types distincts d'envelopper plusieurs valeurs de retour, et sur mon API publique, je ne l'utilise que sur des méthodes qui correspondent avec le TryParse modèle.

0voto

Spencer Ruport Points 24589

Cela ne m'ennuie pas que je ne puisse pas transmettre null au paramètre out pour les fonctions TryParse.

Néanmoins, je préfère dans certains cas renvoyer un nouveau type avec deux données. Surtout quand ils ne sont pas liés pour la plupart ou qu'une pièce n'est nécessaire que pour une seule opération, un instant après. Lorsque j'ai besoin de sauvegarder la valeur résultante d'une fonction TryParse, j'aime vraiment avoir un paramètre out plutôt qu'une classe aléatoire ResultAndValue que je dois gérer.

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