web-dev-qa-db-ja.com

列挙型をオプションのパラメーターとして使用する

私が作業しているアプリケーションにいくつかのメソッドがあり、オプションのパラメーターがロードされています。それらのいくつかは列挙型です。現在、それを行うために、同様のタイプのシグネチャを持つメソッドを書いています。

public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = (MyEnum )(-1)){

     if (myThirdParam != (MyEnum ) (-1))
     {
          //do something with it
     }
}

だから私の最初の質問は、私が気付いていないこのアプローチにはいくつかの落とし穴がありますが、やがて痛々しいことに気づくでしょう、そして次に、より適切な、または少なくともエレガントな解決策がありますか?

私はこのメソッドへの入力を制御していると言うべきです、それは内部で使用されるので、誰かが-1の値をキャストして作品を完成させることを心配していません。

18
El Kabong

enumにデフォルト値(ゼロ)があることを確認してください。これは、「なし」または「無効」を意味します。これは、オプションのパラメーターのデフォルト値として適切な値です。

これは、Microsoft Code Analysisでも推奨されています CA1008:列挙にはゼロ値が必要です

例えば:

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

このようにして default keyword は適切な値を提供しますが、意図しないものを誤って参照することはありません。


例として、BCLはこれと同じ概念を使用します。 SerialPort に使用するストップビットの数は StopBits 列挙型で定義されます。

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

ただし、None値は無効です。実際には、

SerialPortプロパティをArgumentOutOfRangeExceptionに設定すると、StopBitsクラスはNone例外をスローします。

19

このような場合は、次のように nullable enumを使用することをお勧めします。

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

次のように使用できます:

SomeMethod(myThirdParam: MyEnum.Something);
24
JleruOHeP

について:

enum MyEnum {
   MISSING = -1,
   FirstValue,
   SecondValue,
   ...
}

public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = MISSING) {
     if (myThirdParam != MISSING)
     {
          //do something with it
     }
} 
0
Mark Bertenshaw