Comment pouvez-vous utiliser les paramètres facultatifs en C#?
Remarque: Cette question a été posée à un moment où le C# n'est pas encore en charge les paramètres facultatifs (c'est à dire avant le C# 4).
Nous allons construire une API web est généré par programmation à partir d'une classe C#. La classe a la méthode GetFooBar(int a, int b)
et l'API a une méthode GetFooBar
prendre requête params comme &a=foo &b=bar
.
Les classes besoins de prise en charge des paramètres, ce qui n'est pas pris en charge en C# la langue. Quelle est la meilleure approche?
- Ou attendre unitil C# 4.0 est sorti. Les paramètres facultatifs sont pris en charge.
Vous devez vous connecter pour publier un commentaire.
Surpris personne n'a indiqué C# 4.0 paramètres facultatifs qui fonctionne comme ceci:
Edit: je sais qu'à l'époque, la question a été posée, C# 4.0 n'existait pas. Mais cette question s'est classé 1er sur Google pour "C# arguments optionnels" j'ai donc pensé à cette réponse mérite d'être ici. Désolé.
Une autre option est d'utiliser le mot clé params
Appelé comme...
public void log (params object[] args){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < args.Length; i++){ sb.Append("{"); sb.Append(i.ToString()); sb.Append("}"); sb.Append(" "); } String.Format(sb.ToString(),args).Dump(); }
Exemple d'appel:log("...Done,",(watch.ElapsedMilliseconds/1000).ToString(),"s");
En C#, je voudrais l'utiliser normalement les formes multiples de la méthode:
Mise à JOUR: mentionnés ci-dessus ÉTAIT la voie que je n'ai valeurs par défaut avec C# 2.0. Les projets sur lesquels je travaille sont maintenant à l'aide de C# 4.0 qui maintenant prend en charge directement les paramètres facultatifs. Voici un exemple, j'ai juste utilisé dans mon propre code:
À partir de ce site:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C# permet l'utilisation de la [Facultatif] attribut (à partir de VB, mais pas fonctionnelle en C#). Vous pouvez donc avoir une méthode comme ceci:
Dans notre API wrapper, nous détectons des paramètres optionnels (ParameterInfo p.IsOptional) et de définir une valeur par défaut. L'objectif est de marquer des paramètres facultatifs sans recourir à kludges comme ayant "facultatif" dans le nom du paramètre.
Vous pouvez utiliser la surcharge de méthode...
Cela dépend de la méthode de signatures, l'exemple que j'ai donné est manquant "int b", la seule méthode, parce qu'il aurait la même signature que le "int" méthode.
Vous pouvez utiliser les types Nullables...
Vous pouvez ensuite vérifier, à l'aide d'un.HasValue, pour voir si un paramètre a été fixé.
Une autre option serait d'utiliser un 'params' paramètre.
Si vous voulais aller avec des paramètres nommés aurait besoin pour créer un type de poignée d'entre eux, bien que je pense qu'il y a déjà quelque chose de ce genre pour les applications web.
Vous pouvez utiliser l'option paramètres en C# 4.0 sans aucun soucis.
Si nous avons une méthode comme:
lorsque vous appelez la méthode, vous pouvez ignorer les paramètres comme ceci:
C# 4.0 implémente une fonctionnalité appelé "paramètres", vous pouvez passer des paramètres par leurs noms, et bien sûr, vous pouvez passer des paramètres, dans l'ordre que vous voulez 🙂
Bonjour Facultatif Monde
Si vous voulez de l'exécution d'approvisionnement d'une valeur de paramètre par défaut, vous devez utiliser la réflexion pour faire l'appel. Pas aussi beau que les autres suggestions pour cette question, mais compatible avec VB.NET.
Une manière simple qui vous permet d'omettre des tous les paramètres dans n'importe quelle position, est en train de profiter de les types nullables comme suit:
Chaînes sont déjà des types nullables de sorte qu'ils n'ont pas besoin de la ?.
Une fois que vous avez cette méthode, les appels suivants sont valide tous les:
Lorsque vous définissez une méthode de cette façon, vous avez la liberté de définir simplement les paramètres que vous souhaitez par de nommage eux. Voir le lien suivant pour plus d'informations sur les nommés et les paramètres facultatifs:
Nommé et Arguments Optionnels (Guide de Programmation C#) @ MSDN
Je suis d'accord avec stephenbayer. Mais puisque c'est un webservice, il est plus facile pour l'utilisateur final d'utiliser un seul formulaire de la webmethod, que l'utilisation de plusieurs versions de la même méthode. Je pense que dans cette situation les Types Nullables sont parfaits pour les paramètres facultatifs.
paramètres facultatifs sont pour les méthodes. si vous avez besoin d'arguments facultatifs pour une classe et que vous êtes:
à l'aide de c# 4.0: utilisation d'arguments facultatifs dans le constructeur de la classe, une solution que je préfère, car il est plus proche de ce qui est fait avec des méthodes, donc plus facile à retenir. voici un exemple:
à l'aide de c# les versions précédentes de c#4.0: vous devez utiliser le constructeur de chaînage (à l'aide de l' :ce mot-clé), où de plus simple constructeurs conduire à un "maître constructeur".
exemple:
De la manière classique, c'est géré en C# comme stephen mentionnée est la surcharge de la méthode. Par la création de plusieurs versions de la méthode avec des paramètres différents, vous pouvez effectivement créer des paramètres facultatifs. Dans les formes avec moins de paramètres que vous auriez normalement appel de la forme de la méthode avec tous les paramètres de configuration de vos valeurs par défaut dans l'appel à cette méthode.
Vous pouvez surcharge de votre méthode. Une méthode contient un paramètre
GetFooBar(int a)
et l'autre contiennent à la fois des paramètres,GetFooBar(int a, int b)
Place des paramètres par défaut, pourquoi ne pas simplement construire un dictionnaire de classe à partir de la querystring passé .. une mise en œuvre qui est presque identique à la façon asp.net les formes de travail avec querystrings.
soit la Demande.QueryString["un"]
Cela permettra de dissocier la classe de feuilles à partir de l'usine /de code réutilisable.
Vous pourriez également vouloir vérifier Services Web avec ASP.NET. Les services Web sont une api web généré automatiquement à l'aide des attributs de classes C#.
Un peu en retard à la fête, mais je cherchais la réponse à cette question et, finalement trouvé un moyen de plus pour ce faire. Déclarer le type de données pour l'option args web de votre méthode de type XmlNode. Si l'option argument est omis, ce sera la valeur null, et si il est présent, vous pouvez obtenir de l'est de la chaîne de valeur en appelant arg.La valeur, c'est à dire,
Ce qui est aussi décent à propos de cette approche est la .NET généré page d'accueil pour le ws montre encore la liste des arguments (si vous perdez la pratique boîtes de saisie de texte pour les tests).
J'ai un service web pour écrire prend 7 paramètres. Chacun est facultatif attribut de requête à une instruction sql enveloppé par ce service web. Donc deux solutions de contournement pour les non-facultatif params viennent à l'esprit... les deux sont assez pauvres:
method1(param1, param2, paramètre 3, paramètre 4, param 5, param 6, param7)
method1(param1, param2, param3, paramètre 4, param5, param 6)
méthode 1(param1, param2, param3, param4, param5, param7)... commencer à voir l'image. Cette voie est la folie. Beaucoup trop de combinaisons.
Maintenant pour un moyen plus simple qui a l'air gêné, mais devrait fonctionner:
method1(param1, bool useParam1, param2, bool useParam2, etc...)
C'est un appel de méthode, les valeurs de tous les paramètres sont requis, et de traiter chaque cas à l'intérieur. Il est aussi clair comment l'utiliser à partir de l'interface.
C'est un hack, mais il faudra travailler.
J'ai eu à le faire dans un VB.Net 2.0 Service Web. J'ai fini par en spécifiant les paramètres comme des chaînes de caractères, puis de les convertir à tout ce dont j'avais besoin. Un paramètre facultatif a été spécifié avec une chaîne vide. Pas la solution la plus propre, mais il a travaillé. Juste faire attention à ce que vous attraper toutes les exceptions qui peuvent se produire.
Pour juste au cas où, si quelqu'un veut passer un rappel (ou
delegate
) comme un paramètre facultatif, peut le faire de cette façon.Option de Rappel paramètre:
paramètres facultatifs ne sont rien, mais les paramètres par défaut!
je vous suggère de donner les deux paramètres par défaut.
GetFooBar(int a=0, int b=0) si vous n'avez pas de méthode surchargée, se traduira par un=0, b=0 si vous ne passez pas toutes les valeurs,si vous passez 1, entraînera, passée la valeur de a, 0 et si vous passez 2 valeurs 1er sera attribué à l'un et à b.
espère que cela répond à votre question.
Vous pouvez essayer ce trop
Type 1
public void YourMethod(int a=0, int b = 0)
{
//some code
}
Type 2
public void YourMethod(int? a, int? b)
{
//some code
}