C # Enums: 可空值还是“未知”值?

如果我有一个具有 enum成员的类,并且我希望能够表示这个成员没有定义的情况,那么哪种方法更好?

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

public SomeEnum? myEnum;

B)在枚举中加入一个默认的“未知”值,例如:

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

我实在看不出这两种方式有什么主要的利弊,但也许其中一种方式比另一种方式更可取?

35822 次浏览

一定要使用可为空的值类型——这就是它们的用途。上面明确说明了你的意图。它还意味着您可以使用 Enum.IsDefined(如果希望泛型类型安全,则可以使用 无拘无束的旋律中的等价物)来轻松确定某个特定值是否是 真的值,而不必担心“假”值。

如果它可以为空,那么您将得到它作为一个默认值,如果您尝试在 null 时使用它,那么您将得到异常(这是一件好事!)

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

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

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

记住,同时拥有“未知的”枚举成员和枚举本身可以为空并没有什么错。

高温。

我同意 archimed7592的观点,在缺失值和“未知”值之间存在着真正的区别。

例如:

“你是什么血型?”

  • Null = 缺失值—— > 未回答问题—— > 提出问题

  • “未知”—— > 病人表示他不知道—— > 命令实验室测试血型

看情况了!

BillWagner 列出了一些很好的理由来添加 不确定enum当它有意义的时候。我建议你找到完整的项目,但这里有一个预览:

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

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

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

现在,我遇到了这样一种情况: 用户需要从 ComboBox 中选择某种类型,否则就不能选择任何类型。我使用一个具有 [Description("a description")]属性的枚举作为要选择的对象。如果 none/Unknown 是枚举的自然选择,那么我将使用它来表示没有选择任何内容。否则,我将使用 Nullable<MyEnum>

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

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