枚举应该以0还是1开头?

时间:2011-08-31 13:14:58

标签: c# .net enums

想象一下,我定义了以下枚举:

public enum Status : byte
{
    Inactive = 1,
    Active = 2,
}

使用枚举的最佳做法是什么?它应该以{{1​​}}开头,如上例所示,还是以1开头(没有显式值),如下所示:

0

14 个答案:

答案 0 :(得分:151)

Framework Design Guidelines:

  
      
  • 执行在非标记枚举上提供零值   如果None不适合枚举,则将零值分配给元素   应该用作枚举的默认值。

  •   
  • 避免使用标记枚举值为正或负的普通成员   零。 ..枚举值为零会导致出现问题   运营等

  •   

答案 1 :(得分:61)

嗯,我想我对大多数答案表示不同意,这些答案不是明确地给他们编号。我总是明确地给它们编号,但这是因为在大多数情况下我最终会将它们保存在数据流中,并将它们存储为整数值。如果您没有显式添加值然后添加新值,则可以中断序列化,然后无法准确加载旧的持久化对象。如果您打算对这些值进行任何类型的持久存储,那么我强烈建议您明确设置值。

答案 2 :(得分:14)

除非您有特定的理由进行更改,否则请使用默认值保留枚举,默认值从零开始。

public enum Status : byte
{
    Inactive,
    Active
}

答案 3 :(得分:14)

Enum是一种值类型,如果未明确初始化,则其默认值(例如,对于类中的Enum字段)将为0。

因此,您通常希望将0作为已定义的常量(例如,未知)。

在您的示例中,如果您希望Inactive成为默认值,则其值应为零。否则,您可能需要考虑添加常量Unknown

有些人建议您不要明确指定常量的值。在大多数情况下可能是一个很好的建议,但在某些情况下你会想要这样做:

  • Flags enums

  • 其值与外部系统(例如COM)互操作的枚举。

答案 4 :(得分:5)

我认为最好的做法是不对它们进行编号并让它隐含 - 这将从0开始。因为它隐含了它总是很好的语言偏好:)

答案 5 :(得分:5)

我会用0开始一个布尔类型的枚举。

除非“Inative”表示“非活动”以外的其他内容:)

这保留了那些标准。

答案 6 :(得分:5)

我想说,这取决于你如何使用它们。对于标记枚举,最好将None值设为0,如下所示:

[Flags]
enum MyEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    All = Option1 | Option2 | Option3,
}

当您的枚举很可能被映射到数据库查找表时,我将从1开始。对于专业编写的代码而言,这应该没什么关系,但这会提高可读性。

在其他情况下,我会保持原样,不管他们是从0还是1开始。

答案 7 :(得分:4)

除非您有充分的理由使用原始值,否则您应该只使用隐式值并使用Status.ActiveStatus.Inactive引用它们。

问题在于您可能希望将数据存储在平面文件或数据库中,或使用其他人创建的平面文件或数据库。如果您自己制作,请将其编号,使其符合Enum的用途。

如果数据不属于您,那么您当然希望使用原始开发人员用作编号方案的任何内容。

如果您计划将Enum用作一组标志,那么有一个简单的约定值得关注:

enum Example
{
  None      = 0,            //  0
  Alpha     = 1 << 0,       //  1
  Beta      = 1 << 1,       //  2
  Gamma     = 1 << 2,       //  4
  Delta     = 1 << 3,       //  8
  Epsilon   = 1 << 4,       // 16
  All       = ~0,           // -1
  AlphaBeta = Alpha | Beta, //  3
}

值应为2的幂,并且可以使用位移操作表示。 None,显然应该是0,但All不太明显-1~00的二进制否定,并且会产生一个数字,其每一位都设置为1which represents a value of -1。对于复合标记(通常用于方便),可以使用按位或运算符|合并其他值。

答案 8 :(得分:2)

不要分配任何数字。 只需像使用它一样使用它。

答案 9 :(得分:2)

如果你从1开始,那么你可以很容易地计算你的东西。

{
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};

如果从0开始,则使用第一个作为未初始化事物的值。

{
    BOX_NO_THING   = 0,
    BOX_THING1     = 1,
    BOX_THING2     = 2,
    BOX_NUM_THING  = BOX_THING2
};

答案 10 :(得分:2)

如果未指定编号从0开始。

重要的是要明确,因为枚举通常被序列化并存储为int,而不是字符串。

对于存储在数据库中的任何枚举,我们始终明确编号选项以防止在维护期间进行移位和重新分配。

根据Microsoft的推荐,推荐的约定是使用第一个零选项来表示未初始化或最常见的默认值。

以下是开始编号为1而不是0的快捷方式。

public enum Status : byte
{
    Inactive = 1,
    Active
}

如果您希望设置标志值以便在枚举值上使用位运算符,请不要在零值处开始编号。

答案 11 :(得分:0)

首先,除非您为某个原因指定特定值(数值具有其他地方的含义,即数据库或外部服务),否则根本不指定数值并让它们显式。

其次,您应始终拥有零值项(在非标记枚举中)。该元素将用作默认值。

答案 12 :(得分:0)

除非有理由,否则不要在0处启动它们,例如将它们用作数组或列表的索引,或者是否存在其他一些实际原因(如在按位运算中使用它们)。

您的enum应准确到达所需的位置。它也不必是顺序的。如果值被明确设置,则需要反映一些语义或实际考虑。例如,墙上的enum个“瓶子”编号应为1到99,而4的幂enum应该从4开始并继续16,64,256等

此外,只有在enum表示有效状态时,才应将零值元素添加到{{1}}。有时“无”,“未知”,“缺失”等等都是有效值,但很多时候它们都不是。

答案 13 :(得分:-1)

我喜欢在0开始我的枚举,因为它是默认值,但我也想包含一个未知值,值为-1。这将成为默认值,有时可以帮助调试。