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

时间:2009-11-25 09:18:13

标签: c# enums

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

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

public SomeEnum? myEnum;

b)在枚举中添加默认的“未知”值。 E.g:

public enum SomeEnum {
    Unknown,
    SomeValueA,
    SomeValueB,
    SomeValueC,
}

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

6 个答案:

答案 0 :(得分:60)

绝对使用可以为空的值类型 - 这就是它们的用途。它明确说明了你的意图。这也意味着您可以使用Enum.IsDefined(或Unconstrained Melody的等效项,如果您想要通用类型安全性)轻松确定特定值是否为真实值,而无需担心“假”也是。

答案 1 :(得分:18)

我同意archimed7592,缺席值与“未知”值之间存在真正的差异。

示例:

“你的血型是什么?”

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

  • “未知” - >病人表示他不知道 - >订购血型的实验室测试

答案 2 :(得分:7)

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

在需要表示未知值的情况下,额外的枚举成员听起来很好。

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

请记住,同时具有“未知”枚举成员和枚举本身可以为空而没有任何问题。

HTH。

答案 3 :(得分:5)

IT依赖!

Bill Wagner列出了一些很好的理由来添加 Undefined enum。我建议您找到完整的项目,但这是预览:

  

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

     

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

     

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

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

答案 4 :(得分:2)

如果它是可空的,你会把它作为默认值,如果你尝试在null时使用它,你会得到例外(这是一件好事!)

答案 5 :(得分:0)

如果枚举归因于[Flags]属性,则所有内容都会发生变化。

    [Flags]
    enum FlagsEnum
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        FirstAndThird = 5
    }