C# 使用EnumType.None或Nullable<;枚举类型>;?

C# 使用EnumType.None或Nullable<;枚举类型>;?,c#,enums,nullable,object-model,C#,Enums,Nullable,Object Model,枚举通常用于定义类的特定属性的状态,例如在某种类型的对象模型中。对于其中一些属性,“此属性未设置”状态有效 在这些情况下,我应该使用零Noneenum值,还是将属性类型设置为null public MyEnum Property { get; set; } public enum MyEnum { None = 0, Value1, Value2 } 或 使用MyEnum.None-它更具表达力,甚至可以使用MyEnum.Invalid来表达意思 也可以将其设置为0以

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

在这些情况下,我应该使用零
None
enum值,还是将属性类型设置为null

public MyEnum Property { get; set; }

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


使用
MyEnum.None
-它更具表达力,甚至可以使用
MyEnum.Invalid
来表达意思

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

public enum MyEnum {
    InvalidValue = -1,
    Value1 = 1,
    Value2
}
在代码中,您可以轻松地检查传入的该值,并引发描述性异常


不需要可为Null的枚举类型,且该类型的表现力较低。它要求代码的用户意识到这一点并检查是否为空。

使用
MyEnum.None
-它更具表现力,甚至
MyEnum.Invalid
来传达含义

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

public enum MyEnum {
    InvalidValue = -1,
    Value1 = 1,
    Value2
}
在代码中,您可以轻松地检查传入的该值,并引发描述性异常


不需要可为Null的枚举类型,且该类型的表现力较低。它要求您的代码用户意识到这一点并检查是否为空。

很难得出结论,您的应用程序中有很多因素会影响这一点。我倾向于将枚举值定义为0,但不在枚举中指定零值

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;

这提供了sentinel值的好处,而不会污染枚举。

很难得出结论,应用程序中的许多因素都会影响这一点。我倾向于将枚举值定义为0,但不在枚举中指定零值

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;

这提供了sentinel值的好处,而不会污染枚举。

我将使用“None”值而不是可为空的枚举。如果没有其他内容,对我来说,
If(Property==MyEnum.None)
If(Property==null)
可读性好得多

我会使用“None”值而不是可为空的枚举。如果没有其他内容,对我来说,
If(Property==MyEnum.None)
If(Property==null)
可读性好得多,另一个选项是将第一个值设置为1,因为它最初是0

enum Foo 
{
   A = 1,
   B = 2
}

...

Foo myFoo = (Foo)0;
public enum MyEnum {
    Value1 = 1,
    Value2
}

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

另一个选项是将第一个值设置为1,因为它的初始值为0

public enum MyEnum {
    Value1 = 1,
    Value2
}
我认为你的两种情况都可以接受!这将取决于你的情况。使用用户界面时,第一个带有“None”值的示例可能会更容易使用。但是,Nullable提供了有关如何使用变量的更多信息