使用EnumType.None或Nullable <enumtype>?</enumtype>

时间:2010-08-25 14:55:53

标签: c# enums nullable object-model

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

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

public MyEnum Property { get; set; }

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

public MyEnum? Property { get; set; }

public enum MyEnum {
    Value1,
    Value2
}

4 个答案:

答案 0 :(得分:6)

使用MyEnum.None - 表达意义更具表现力,甚至MyEnum.Invalid

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

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

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

可预期的可枚举枚举类型不具有表现力。它要求您的代码用户知道这一点并检查空值。

答案 1 :(得分:0)

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

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;

这样可以获得标记值的好处,而不会污染枚举。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

public enum MyEnum {
    Value1 = 1,
    Value2
}

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