2010-08-03 8 views
8

Nous utilisons le framework .NET 2.0 avec C# 3.0 (je pense que c'est la dernière version de C# qui peut fonctionner sur la version 2.0 du framework, corrigez-moi si je me trompe).Meilleure façon de vérifier les paramètres?

Y at-il quelque chose de construit en C# qui peut rendre ce type de validation de paramètre plus pratique?

public ConnectionSettings(string url, string username, string password, 
          bool checkPermissions) 
{ 
    if (username == null) { 
     throw new ArgumentNullException("username"); 
    } 

    if (password == null) { 
     throw new ArgumentNullException("password"); 
    } 

    if (String.IsNullOrEmpty(url)) { 
     throw new ArgumentException("Must not be null or empty, it was " + 
      (url == null ? url : "empty"), "url"); 
    } 

    this.url = url; 
    this.username = username; 
    this.password = password; 
    this.checkPermissions = checkPermissions; 
} 

Ce genre de validation des paramètres devient un modèle commun et les résultats dans beaucoup de code « presque partout » à patauger dans nos méthodes publiques.

S'il n'y a rien intégré. Y a-t-il d'excellentes librairies libres que nous pourrions utiliser?

+0

Je pense que ce besoin de changer de la ligne pour éviter une exception de référence null? (url == null? Url: "vide"), "url"); à (url == null? "Null": "vide"), "url"); – w69rdy

+0

Vous recherchez un outil de programmation orienté aspect. Je sais qu'il y en a quelques-uns, qui s'intègrent à Visual Studio et injectent du code dans vos assemblys IL au moment de la compilation. Mais je n'arrive pas à faire fonctionner mon google ce matin. – Will

+0

Vous devriez être en mesure d'assouplir certaines méthodes de convienience pour fournir la plupart des fonctionnalités, mais je suis d'accord, ce serait bien d'avoir du sucre synthétique pour cela. Je suis particulièrement malade de jeter deux exceptions séparées pour les deux cas de string.IsNullOrEmpty – cristobalito

Répondre

4

Je crée normalement des méthodes d'aide statiques ...

Par ex Signifie que vous pouvez condenser votre code à quelque chose de semblable à ci-dessous et le rend juste un peu plus ordonné.

CheckNotNull(username, "username"); 
CheckNotNull(password, "password"); 

Ou vous pouvez envelopper comme une méthode d'extension:

public static void CheckNotNull<T>(this T value, string parameterName) 
{ 
    if(value == null) { throw new ArgumentNullException(parameterName); } 
} 

Et utiliser comme:

username.CheckNotNull("username"); 
password.CheckNotNull("password"); 

Et si vous vous sentez que vous pourriez vraiment envie, probablement interroger le noms de paramètres en utilisant la réflexion. La réflexion est un peu lente, donc vous ne le feriez que si vous alliez lancer une exception, mais cela vous évite de taper le nom du paramètre littéral tout le temps.

+0

Encore faut-il mettre le nom du paramètre dans une chaîne (que vous avez commodément laissée de côté). –

+0

Ben, en effet c'était une erreur mais corrigée avant la downvote. – Ian

+0

Et j'ai défait le downvote maintenant que je vois que vous l'avez réparé. –

2

Vous pouvez le faire en utilisant des contrats mais c'est le même concept.

Cela devrait être une bonne pratique de toute façon, car il montre clairement ce que sont les champs obligatoires sur une méthode publique.

3

Here's a nice fluent way de le faire.

What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)

public static class Extensions 
{ 
     public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class 
     { 
       if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null"); 
     } 
} 

internal class Test 
{ 
     public Test(string input1) 
     { 
       input1.ThrowIfArgumentIsNull("input1"); 
     } 
} 
+0

Giorgi a déjà mentionné cette méthode. Aussi ... vous avez toujours cette chaîne laide avec le nom du paramètre. –

2

Identique à la validation de paramètres courants mentionnée par Giorgi, mais celle-ci évite de nommer de façon redondante le paramètre, et les chaînes qui ne peuvent pas être mises à jour automatiquement par les outils de refactoring de code.

http://charlieflowers.wordpress.com/tag/parameter-validation/

4

Vous pouvez utiliser un tisserand il comme Post Sharp, gardez à l'esprit que le compilateur en tant que service en C# 5 fera ce genre de choses construit.

Personnellement, je ne recommanderais pas cette approche à moins que le problème est énorme et doit être abordé. Habituellement, quelques affirmations et vérifications préalables comme vous l'avez décrit ci-dessus est une pratique exemplaire.

EG:

public ConnectionSettings(
    [NotNullOrEmpty] string url, 
    [NotNull] string username, 
    [NotNull] string password, 
    bool checkPermissions) 
{ 
    this.url = url; 
    this.username = username; 
    this.password = password; 
    this.checkPermissions = checkPermissions; 
} 

Vous pouvez également intégrer ce genre de choses avec code contracts qui vous permettra d'effectuer une analyse statique riche.

Questions connexes