C#枚举:可空或"未知"值?

UpT*_*eek 62 c# enums

如果我有一个enum成员的类,我希望能够代表没有定义该成员的情况,哪个更好?

a)使用可空类型将该成员声明为类中可为空的.例如:

public SomeEnum? myEnum;
Run Code Online (Sandbox Code Playgroud)

b)在枚举中添加默认的"未知"值.例如:

public enum SomeEnum {
    Unknown,
    SomeValueA,
    SomeValueB,
    SomeValueC,
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我都无法看到任何重大利弊; 但也许一个优于另一个?

Jon*_*eet 62

绝对使用可以为空的值类型 - 这就是它们的用途.它明确说明了你的意图.这也意味着您可以使用Enum.IsDefined(或者如果您想要通用类型安全,可以使用Unconstrained Melody中的等效物)来轻松确定特定值是否为实际值而不必担心"假"值.

  • 也许FxCop规则比可空类型更早? (5认同)
  • 有趣.相关:为什么FxCop抱怨没有零值的枚举(即在为每个条目分配显式值的枚举中),建议值为0的"无"条目?似乎添加一个人为的"无"是一个像你的答案状态一样的"假"值,因此是一个劣等的解决方案?请参阅:http://msdn.microsoft.com/en-us/library/ms182149(VS.80).aspx (4认同)
  • 是的,它回到我的观点,如果你使用一个可空的,那么你得到一个合理的默认值,这是该规则试图强制执行的. (2认同)

小智 19

我同意archimed7592,缺席值和"未知"值之间存在真正的差异.

例:

"你的血型是什么?"

  • Null =缺席值 - >问题未得到回答 - >提出问题

  • "未知" - >患者表示他不知道 - >为血型进行实验室测试


arc*_*592 7

您只需要决定是否需要一个值来表示未知值,或者您需要一种方法来表示没有任何值.

在需要表示未知值的情况下,额外的枚举成员听起来很好作为解决方案.

如果需要表示没有任何值,请将其置为可空.

请记住,让"未知"的枚举成员和枚举本身同时可以为空,这没有任何问题.

HTH.


Ham*_*jan 5

这取决于!

比尔瓦格纳列出了一些很好的理由来添加一个Undefined, enum当它有意义时.我建议你找到完整的项目,但这是一个预览:

第8项:确保0是值类型的有效状态

默认的.NET系统初始化将所有对象设置为全0.您无法阻止其他程序员创建初始化为全0的值类型的实例.将其设为您的类型的默认值.

一个特例是枚举.永远不要创建不包含0作为有效选择的枚举.所有枚举都派生自System.ValueType.枚举的值从0开始,但您可以修改该行为......

现在,我有一种情况,用户需要从ComboBox中选择某种类型,或者他们没有选择任何类型.我使用带有[Description("a description")]属性的枚举作为要选择的对象.如果没有/ Unknown是枚举的自然选择,那么我会用它来表示没有选择任何东西.否则,我会用一个Nullable<MyEnum>.