如果我有一个enum
成员的类,我希望能够代表未定义此成员的情况,哪个更好?
a)使用可空类型将该成员声明为类中的可空。例如:
public SomeEnum? myEnum;
b)在枚举中添加默认的“未知”值。 E.g:
public enum SomeEnum {
Unknown,
SomeValueA,
SomeValueB,
SomeValueC,
}
我无论如何都看不出任何重大利弊;但也许一个优于另一个?
答案 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
}