Utiliser un enum comme paramètre optionnel

J’ai plusieurs méthodes dans une application sur laquelle je travaille, chargées de parameters facultatifs, dont certains sont des énumérations. Actuellement, pour ce faire, j’écris des méthodes avec un type de signature similaire:

public void SomeMethod(ssortingng myFirstParam = "", ssortingng mySecondParam = "", MyEnum myThirdParam = (MyEnum )(-1)){ if (myThirdParam != (MyEnum ) (-1)) { //do something with it } } 

Ma première question est donc la suivante: y a-t-il un inconvénient à cette approche dont je ne me suis pas rendu compte, mais qui finira par devenir douloureusement conscient de, et deuxièmement, existe-t-il une solution plus appropriée – ou du moins élégante -?

Je devrais dire que nous contrôlons l’entrée de cette méthode, elle est utilisée en interne, je ne crains donc pas que quelqu’un spécifie une valeur de -1 pour gommer le travail.

Assurez-vous que votre enum a une valeur par défaut (égale à zéro), ce qui signifie “aucun” ou “invalide”. Ce serait une valeur appropriée pour la valeur par défaut de votre paramètre facultatif.

C’est également recommandé par Microsoft Code Analysis, CA1008: les énumérations doivent avoir une valeur zéro .

Par exemple:

 enum SpeakerType { None = 0, Woofer, Midrange Tweeter } 

De cette façon, le mot clé default fournit une valeur saine, mais ne fait pas involontairement référence à quelque chose que vous ne souhaitez pas.


A titre d’exemple, la BCL utilise ce même concept. Le nombre de bits d’arrêt à utiliser pour un SerialPort est défini par l’énumération StopBits :

 public enum StopBits { None, One, Two, OnePointFive, } 

Cependant, la valeur None n’est pas valide. En réalité,

La classe SerialPort lève une exception ArgumentOutOfRangeException lorsque vous définissez la propriété StopBits sur None .

Je suggérerais d’utiliser nullable enum dans cette situation, comme ceci:

 public void SomeMethod(ssortingng myFirstParam = "", ssortingng mySecondParam = "", MyEnum? myThirdParam = null) { if (myThirdParam.HasValue) { var enumValue = myThirdParam.Value; //do something with it } } 

et vous pouvez l’utiliser comme ceci:

 SomeMethod(myThirdParam: MyEnum.Something); 

Qu’en est-il de :

 enum MyEnum { MISSING = -1, FirstValue, SecondValue, ... } public void SomeMethod(ssortingng myFirstParam = "", ssortingng mySecondParam = "", MyEnum myThirdParam = MISSING) { if (myThirdParam != MISSING) { //do something with it } }