0

枚举通常用于定义类的特定属性的状态,例如在某种对象模型中。对于其中一些属性,“此属性未设置”状态是有效的。

在这些情况下,我应该使用零None枚举值,还是使属性类型可为空?

public MyEnum Property { get; set; }

public enum MyEnum {
    None = 0,
    Value1,
    Value2
}

或者

public MyEnum? Property { get; set; }

public enum MyEnum {
    Value1,
    Value2
}
4

4 回答 4

6

使用MyEnum.None- 它更具表现力,甚至MyEnum.Invalid可以传达意义。

您还可以将其设置为 0 以外的其他值 - 因为它基于 int,您可以将其设置为 -1 并将第一个有效值设置为 1:

public enum MyEnum {
    InvalidValue = -1,
    Value1 = 1,
    Value2
}

在您的代码中,您可以轻松地检查传入的此值并引发描述性异常。

可以为 null 的枚举类型是不可预期的,并且表达能力较差。它要求您的代码用户意识到这一点并检查空值。

于 2010-08-25T14:58:03.290 回答
0

很难最终回答这个问题,您的应用程序中的很多因素都会影响这一点。我倾向于将枚举值定义为 0,而不是在枚举中指定零值。

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;

这带来了哨兵值的好处,而不会污染枚举。

于 2010-08-25T14:58:39.963 回答
0

我会使用“无”值而不是可为空的枚举。如果不出意外,对我if(Property == MyEnum.None)来说比if(Property == null).

于 2010-08-25T14:58:44.117 回答
0

另一种选择是将第一个值设置为 1,因为它最初为 0。

public enum MyEnum {
    Value1 = 1,
    Value2
}

我觉得你这两种情况都可以接受!这将取决于你的情况。在使用用户界面时,您的第一个具有“无”值的示例可能更易于使用。但是,Nullable 提供了有关如何使用变量的更多信息。

于 2010-08-25T15:00:20.460 回答