2010-04-13 5 views
2

Ceci est principalement par simple curiosité, et est potentiellement une question idiote. :)Une méthode plus rapide pour effectuer des contrôles sur les arguments de la méthode

J'ai une méthode comme ceci:

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    // some magic here 
} 

Aucun des arguments peut être nulle, et aucun des arguments de chaîne ne peut égaler String.Empty.

Au lieu de me avoir une grande liste de:

if(arg1 == string.Empty || arg1 == null) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

est-il un moyen plus rapide de vérifier que tous les arguments de chaîne?

Excuses si ma question n'est pas claire.

Merci!

+0

J'ai regardé un peu et je posterai cela comme un commentaire comme n'est pas vraiment une réponse. Dans mon livre, ce serait bien si nous pouvions définir un "symbole" à utiliser sur les arguments dans une signature de méthode. Disons donc que nous assignons les contrôles non nul et non vide au symbole!, Puis dans la signature de la méthode, cela pourrait être MyMethod (string! MyArg), avec C# faisant la vérification automatique et le lancement des exceptions. Bien sûr, je peux le faire maintenant avec une méthode, mais si je pouvais assigner un symbole que je pourrais utiliser dans la signature, il serait beaucoup plus rapide de taper! Pensées? – AndrewC

Répondre

7

Vous pouvez créer ou utiliser des schémas pour vérifier votre contrat de méthode, par exemple Code Contracts.

Vous pouvez également créer diverses méthodes d'utilitaire comme ThrowIfNullOrEmpty qui encapsuleront la logique de vérification des arguments.

+0

Merci! En regardant dans ceux-ci! – AndrewC

3
if (string.IsNullOrEmpty(arg1)) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

Il y a aussi code contracts dans .NET 4.

4

Vous pouvez utiliser String.IsNullOrEmpty:

if (String.IsNullOrEmpty(arg1)) 
    throw new ArgumentException("issue with arg1"); 

Si vous êtes sur le cadre 4, il y a aussi une méthode String.IsNullOrWhiteSpace (peut-être vous voulez aussi jeter si quelqu'un appelle la méthode avec une chaîne contenant des espaces seulement).

Vous pouvez créer une méthode utilitaire pour vérifier un argument et lancer, mais c'est la notation la plus courte que vous obtiendrez. Il n'y a pas de syntaxe en C# qui vous permet d'exprimer au compilateur, que les nulls sont inacceptables, et que le langage lance les exceptions pour vous.

Avec la structure 4, vous avez également CodeContracts - mais la syntaxe pour l'utiliser reste un appel de méthode.

+1

C'est cool, bien que je me demande s'il y avait un moyen encore plus rapide. Penser à haute voix ici, mais ce serait bien s'il y avait une forme de notation abrégée qui pourrait être ajoutée aux arguments dans une signature de méthodes afin que C# jette automatiquement une exception d'argument si elle était nulle ou vide. – AndrewC

0

Eh bien, tout d'abord, vous pouvez utiliser if (!String.IsNullOrEmpty(arg1)) pour réduire l'expression if. Deuxièmement, avez-vous besoin de vérifier les arguments dans votre version release, ou est-ce que cela suffirait pour effectuer une vérification des arguments dans votre build de débogage? Cela dépend de l'origine des données. Si cette fonction est appelée par votre propre code et que les arguments sont traités par votre code d'appel, il suffira probablement de vérifier les arguments dans vos versions de débogage uniquement. Dans ce cas, utilisez Debug.Assert(!String.IsNullOrEmpty(arg1), "msg");, etc. Les assertions sont supprimées des générations de version.

Troisièmement, consultez DevLabs: Code Contracts

3

Le vrai problème ici est que votre méthode a trop d'arguments. Cela rend difficile pour vous d'écrire le code de validation. Cela rend également le code du client trop lourd. Envisagez d'écrire une classe d'aide où les arguments que vous passez maintenant sont des propriétés. Votre méthode pourrait maintenant prendre seulement un argument. Et la validation peut être faite dans la classe elle-même au lieu de votre méthode.

L'exemple canonique de ce modèle dans le Framework est la classe Process.La classe d'assistance ProcessStartInfo le conserve utilisable.

3

Il y a une belle bibliothèque appelée CuttingEdge.Conditions qui fournit une interface fluide pour cela:

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    Condition.Requires(arg1, "arg1").IsNotNull().IsNotEmpty().StartsWith("Foo"); 
} 

Il fournit du type des conditions de sécurité pour toutes sortes de validations, y compris les chèques nuls, vérifie la plage des numéros, la chaîne de contrôle (y compris la StartsWith ci-dessus), etc ... Si vous avez plusieurs vérifications de paramètres, cela peut considérablement raccourcir et simplifier votre validation, et surtout, rendre la vérification des arguments et les exceptions cohérentes dans toute votre application.

+0

+1, belle bibliothèque en effet – sll

-1

Pour autant que je pouvais comprendre votre question, que diriez-vous que:

static void Main(string[] args) 
{ 
    Test(null, "", "", ""); 
} 

static void Test(MyClass arg1, params string[] args) 
{ 
    if (args.Count(a => String.IsNullOrEmpty(a)) == args.Length) 
    { 
     throw new Exception("All params are null or empty"); 
    } 
} 
+1

Voulez-vous dire 'if (args.Any (a => a == null || (une chaîne est &&! String.IsNullOrEmpty (a))) {throw new Exception (" Aucun param peut être nul ou vide. ")}'? – ANeves

+0

@sr pt: Merci Excellent conseil sur 'Any()' – abatishchev

Questions connexes