2009-07-30 7 views
1

J'ai une méthode qui prend un tas de paramètres optionnels et je surcharge la méthode pour fournir les différentes combinaisons de signatures. Intellisense apparaît avec un tas de signatures différentes mais je pense que cela semble assez confus maintenant parce qu'il y a différentes combinaisons que je dois fournir, et pas seulement en construisant des paramètres à la fin de la signature de la méthode. Est-ce que je ne devrais pas surcharger ma méthode et m'en tenir à une signature pour que l'utilisateur de ma méthode passe des valeurs nulles? Cela rendrait la signature plus claire mais rendrait le code appelant plus désordonné.Paramètres optionnels

Répondre

8

Etes-vous limité à utiliser C# 1-3? C# 4 prend en charge les paramètres facultatifs et les arguments nommés ...

Jusque-là, vous devriez probablement soit bâton avec une surcharge ou créer une classe séparée avec des propriétés mutables, par exemple

FooOptions options = new FooOptions { Name="Jon", Location="Reading" }; 
Foo foo = new Foo(options); 

Cela peut être fait dans une déclaration si vous voulez ... et si certaines des propriétés sont obligatoires, puis créez un seul constructeur dans FooOptions qui prend tous.

En C# 4 vous seriez en mesure d'écrire:

Foo foo = new Foo(name: "Jon", location: "Reading"); 

si le constructeur a été écrit comme

public Foo(string name, 
      int age = 0, 
      string location = null, 
      string profession = null) 

arguments nommés et les paramètres facultatifs devrait rendre beaucoup plus facile de construire des types immuables avec des propriétés facultatives dans C# 4 :)

+0

Oui, sur C# 2 J'ai peur, je dois attendre les paramètres C# 4 et optionnels. – Charlie

+0

Ouais, ce sera vraiment pratique – SwDevMan81

0

Pensez à l'argument params de la méthode C#.

void test(params object []arg) { 
    .. 
} 
+4

Presque certainement la mauvaise approche: vous perdez la sécurité de type à moins que tous vos paramètres sont du même type, et vous perdez la moindre idée de quel paramètre signifie quoi. –

+0

Cela vous fera perdre la sécurité de type et nécessite la mise en boîte des types de valeur. Les deux ne sont généralement pas souhaitables. –

0

Vous pouvez utiliser le params keyword si les définitions de fonction ne varient que de la longueur (et non l'ordre, sinon ce ne sera pas la meilleure approche) .Ensuite dans la fonction que vous pouvez configurer les valeurs que vous avez besoin en fonction de l'entrée des paramètres

+0

Je ne considèrerais 'params' que si les arguments sont du même type. Voir aussi le commentaire de Jon sur une autre réponse. –

+0

Ouais, c'est un peu ce que je mentionnais, que seulement si l'ordre des types est le même cela fonctionnerait vraiment. Sinon, les réponses de Jon sont la voie à suivre – SwDevMan81

+0

Cela ne marchera pas dans mon cas car j'ai besoin d'une signature fixe. Ce serait bien si je passais dans certaines données dont j'avais besoin sous la forme d'un tableau comme string.Format – Charlie

Questions connexes