私が作業しているアプリケーションにいくつかのメソッドがあり、オプションのパラメーターがロードされています。それらのいくつかは列挙型です。現在、それを行うために、同様のタイプのシグネチャを持つメソッドを書いています。
public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = (MyEnum )(-1)){
if (myThirdParam != (MyEnum ) (-1))
{
//do something with it
}
}
だから私の最初の質問は、私が気付いていないこのアプローチにはいくつかの落とし穴がありますが、やがて痛々しいことに気づくでしょう、そして次に、より適切な、または少なくともエレガントな解決策がありますか?
私はこのメソッドへの入力を制御していると言うべきです、それは内部で使用されるので、誰かが-1の値をキャストして作品を完成させることを心配していません。
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
例外をスローします。
このような場合は、次のように 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);
について:
enum MyEnum {
MISSING = -1,
FirstValue,
SecondValue,
...
}
public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = MISSING) {
if (myThirdParam != MISSING)
{
//do something with it
}
}