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


68

如果我有一个带有enum成员的类,并且希望能够代表未定义该成员的情况,那更好吗?

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

public SomeEnum? myEnum;

b)在枚举中添加默认的“未知”值。例如:

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

无论哪种方式,我都看不到任何主要的利弊。但是也许一个比另一个更可取?


这个问题确实应该标记为“主观”。
罗伯特·耶普森

26
好吧,如果这个问题听起来很主观,那只能取决于我缺乏知识。如果有确凿的理由为什么一个应该比另一个使用,那么它并不是真正的主观。
UpTheCreek

Answers:


67

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


4
有趣。相关:为什么FxCop会抱怨没有零值的枚举(即在为每个条目分配显式值的枚举中),建议使用值为0的“无”条目?像添加答案一样,添加人工“ None”似乎不是一个“假”值,因此是次等解决方案吗?请参阅:msdn.microsoft.com/en-us/library/ms182149(VS.80).aspx
Mark Carpenter,2009年

5
也许FxCop规则早于可空类型?
乔恩·斯基特

2
是的,这回溯到我的观点,即如果您使用可为空的值,那么您将获得明智的默认值,这是该规则试图强制执行的。
Fiona-myaccessible.website

1
刚刚和我的同事讨论过,但是如果乔恩·斯凯特(Jon Skeet)说使用nullable,我想我的论点是无效的:)
Rytis我

1
@Neo:是的,这很有道理。
乔恩·斯基特

21

我同意archimed7592的观点,即缺失值和“未知”值之间确实存在差异。

例:

“你的血型是什么?”

  • Null =缺少值->尚未回答问题->提出问题

  • “未知”->患者表示他不知道->订购实验室检查血型


7

您只需要决定是需要一个值来表示未知值,还是需要一种方法来表示不存在任何值。

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

如果需要表示不存在任何值,请使其可为空。

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

HTH。


5

这取决于!

Bill Wagner列出了一些在合理的 enum情况下添加Undefined的充分理由。我建议您找到完整的项目,但以下是预览:

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

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

枚举是一种特殊情况。切勿创建不包含0作为有效选择的枚举。所有枚举均派生自System.ValueType。枚举的值从0开始,但是您可以修改该行为...

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



1

如果枚举被赋予[Flags]Attribute,则一切都会改变。

    [Flags]
    enum FlagsEnum
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        FirstAndThird = 5
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.