【问题标题】:Using an enum as an optional parameter使用枚举作为可选参数
【发布时间】:2014-02-07 00:51:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么不给你的 MyEnum 添加一个额外的值,比如“MyEnum.DEFAULT”?所以你不需要投 -1。
  • 我同意。比制作​​一个可以为空的参数并不得不到处使用 .HasValue 或 .Value 更好,只需给枚举一个“UNKNOWN”值。

标签: c# enums optional-parameters


【解决方案1】:

我建议在这种情况下使用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);

【讨论】:

  • @JonathonReinhart - 你有什么建议作为替代方案?
  • @JonathonReinhart:也许我误解了可空类型如何工作的细微差别,但我不相信 boxing 与此有关。编辑:但是,我反对在这种情况下使用可空值,因为它更像是一个 magic 值。
【解决方案2】:

确保您的enum 具有默认值(等于零),即“无”或“无效”。这对于您的可选参数的默认值来说是一个合适的值。

这也是微软代码分析推荐的,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 值无效。事实上,

当您将StopBits 属性设置为None 时,SerialPort 类会引发ArgumentOutOfRangeException 异常。

【讨论】:

  • 我知道其他人建议只使用默认值 - 但这是最​​彻底和最有说服力的答案,所以我将接受这个答案,感谢大家的帮助。
  • 如果您使用某个库中的枚举并希望将默认值设置为枚举中的默认值以外的其他值,则此答案无济于事。我想除非你制作自己的枚举来模仿图书馆中的枚举,否则没有办法做到这一点。
【解决方案3】:

怎么样:

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

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

【讨论】:

  • 我的回答优于这个的原因是这种类型的变量将默认为FirstValue,而不是您可能想要的MISSING
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2011-05-30
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多