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

如果我有一个enum成员的类,我想能够表示这个成员没有定义的情况,哪个更好?

a)使用可为空的types声明该成员在类中是可空的。 例如:

 public SomeEnum? myEnum; 

b)向枚举添加一个默认的“未知”值。 例如:

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

我无论如何也看不出任何重大的利弊。 但也许一个比另一个更可取?

绝对使用可空值types – 这就是他们的目的。 它明确表示你的意图。 这也意味着你可以使用Enum.IsDefined (或者如果你想要genericstypes的安全,那么你可以使用Enum.IsDefined (或者来自Unconstrained Melody的等价物)来容易地确定一个特定的值是否是一个真正的值,而不用担心“假”的。

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

例:

“你的血型是什么?”

  • 空=没有值 – >问题没有被回答 – >问这个问题

  • “未知” – >患者表示他不知道 – >命令血型的实验室testing

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

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

如果需要表示没有任何价值,则可以为空。

请记住,同时拥有“未知”的枚举成员和枚举本身是可空的是没有错的。

HTH。

这取决于!

比尔·瓦格纳(Bill Wagner)列举了一些很好的理由,在有意义的时候添加一个未定义的 enum 。 我build议你find完整的项目,但是这是一个预览:

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

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

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

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

如果它是可以为空的,那么你会得到它作为默认值,如果你试图在null时使用它,你会得到exception(这是一件好事!)

如果枚举属于[Flags]属性,则所有内容都会更改。

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