2009-05-04 7 views
2

J'ai une fonction en C# qui ressemble à:Quel pourrait être le chemin le plus court de vérifier le paramètre de la fonction, ce qui pourrait avoir des valeurs 0, 1, 2, 3 en C#

public static void OnlyValidInput (int parameterName) 
{ 
    if (parameterName == 0 || parameterName ==1 || 
     parameterName == 2 ...) 
{ 
    ... do Ok stuff 
} 
else 
{ throw new CustomException ("invalid param should be 0 , 1 , 2"); 
} 
} 

Comment raccourcir. ..

Merci à tous, la réponse a montré ce que je pensais, mais n'a pas pu le décrire ...

Répondre

13
if (parameterName >= 0 && parameterName <= 3) 

Si vous vous attendez à être Continuous.

+1

Doit être <3 :) –

+1

Le titre indique "0, 1, 2, 3". Le code a un .. j'ai 2 donc j'ai présumé qu'il a juste laissé tomber le 3. – Michael

+0

'si (0 <= parameterName && parameterName <= 3)' est plus évident et plus facile à vérifier à mes yeux. –

3

Juste pour être stupide ...

if((parameterName & 0xFFFFFFFC) == 0) // Check if value is 0, 1, 2, 3 

Fondamentalement, il est en train de vérifier pour voir s'il n'y a que ceux dans les deux bits de poids faible (ce qui est vrai que pour 0, 1, 2, 3)

Je ne le ferais jamais vraiment; la méthode && est beaucoup plus claire ...

4

Je diviserais vos préoccupations en 2 méthodes. Un pour valider l'entrée et l'autre pour faire des choses. Il semble que vous ayez une valeur haute et basse pour la valeur parameterName. Dans ce cas changer l'existence de ce moins, supérieur à vérifier par rapport à la vérification explicitement chaque valeur unique

public static bool IsValid(int parameterName) { 
    return (parameterName >= 0) && (parameterName <= 2); 
} 

public static void OnlyValidInput(int parameterName) { 
    if (!IsValid(parameterName)) { 
    throw new CustomExceptoin("..."); 
    } 
    .. Do stuff 
} 
6

Peut-être OT, mais dans votre exemple de code que je préfère jeter un ArgumentOutOfRangeException.

+0

Voilà pour quoi! –

+0

J'étais sur le point d'ajouter ceci –

1

Pour obtenir la vérification de la compilation, créez une énumération avec des valeurs pour chacun de vos arguments valides et transmettez-la comme un paramètre au lieu d'un int.

Bien sûr, si vous avez une très grande plage, cela ne fonctionnera pas très bien, mais si c'est vraiment juste de 0 à 2 cela ressemble plus à ces chiffres que quelque chose qui devrait être .. énuméré .. de toute façon.

+0

Cela interdirait-il d'utiliser (MyEnum) 0x123? –

+0

Tnx, pourriez-vous poster un petit exemple –

+0

@Dainel L: Intéressant! Merci pour celui-là ... :) –

1
public static void OnlyValidInput (int parameterName) 
{ 
    if(new int[]{0,1,2}.Contains(parameterName)) 
    { 
     //... do Ok stuff 
    } 
    else throw new CustomException ("invalid param should be 0 , 1 , 2"); 
} 
-7
public enum Parameter 
{ 
    Zero = 0, 
    One = 1, 
    Two = 2, 
    Three = 3 
} 

public void SomeMethod(Parameter p) 
{ 
    Int32 pAsInteger = (Int32)p; // Here I am casting the parameter to an Integer 
} 

SomeMethod((Parameter)2); // Here I am casting an integer to enum of type Parameter 

La méthode accepte que le recenseur du type de paramètre.

Vous ne devriez bien sûr pas renommer votre énumérateur et ses valeurs à quelque chose de descriptif et facile à comprendre.

+5

Voir les commentaires à ma réponse: vous pouvez toujours lancer une valeur non valide en tant que paramètre enum. –

+4

Cela ne valide pas l'entrée. Ce qui suit compile bien. SomeMethod ((Paramètre) 42); – JaredPar

+0

C'est vrai .. Si le type d'origine des paramètres est un entier. Si non; alors c'est la voie à suivre à mon avis. Vous voudrez peut-être ajouter quelque chose, Don Ronny – roosteronacid

Questions connexes