使用枚举作为可选参数

时间:2014-02-07 00:51:32

标签: c# enums optional-parameters

我在应用程序中有几个方法,我正在加载可选参数,其中一些是枚举。目前,为了做到这一点,我正在编写具有类似签名类型的方法:

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

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

所以我的第一个问题是,这种方法是否存在一些我没有意识到的陷阱,但是时间会变得痛苦地意识到,其次,是否有更合适的 - 或者至少是优雅的解决方案?

我应该说我们控制了这个方法的输入,它是在内部使用的,所以我并不担心有人会使用值为-1来修改作品。

3 个答案:

答案 0 :(得分:22)

我建议在这种情况下使用nullable枚举,如下所示:

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);

答案 1 :(得分:18)

确保您的enum有默认值(等于零),表示“无”或“无效”。这将是您的可选参数的默认值的适当值。

这也是Microsoft Code Analysis推荐的CA1008: Enums should have zero value

例如:

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

这样default keyword提供了一个理智的值,但不会无意中引用你不想要它的东西。


例如,BCL使用相同的概念。用于SerialPort的停止位数由StopBits枚举定义:

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

None值无效。事实上,

  

SerialPort类将ArgumentOutOfRangeException属性设置为StopBits时会抛出None个异常。

答案 2 :(得分:0)

怎么样:

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

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