Enum应该从0还是1开始?

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

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

什么是使用枚举的最佳做法? 应该像上面的例子一样从1开始,或者从0开始(没有显式值),像这样:

 public enum Status : byte { Inactive, Active } 

框架devise指南:

  • 在非标志枚举上提供一个零值如果None不适合枚举,那么将零值赋给应该用作枚举默认值的元素。

  • 避免使用负值或零的标志枚举值普通成员。 一个枚举值为零会带来问题操作等

那么,我想我不同意大多数答案,说不明确的数字。 我总是明确地给它们编号,但是这是因为在大多数情况下,我最终将它们保存在一个数据stream中,并以整数值forms存储。 如果不明确地添加值,然后添加一个新值,则可以中断序列化,然后无法正确加载旧的持久对象。 如果你打算做任何types的这些值的持久存储,那么我会强烈build议明确设置值。

Enum是一个值types,如果没有明确初始化它的默认值(例如一个类中的Enum字段)将是0。

所以你通常想把0作为一个定义的常量(例如Unknown)。

在你的例子中,如果你想让Inactive成为默认值,那么它的值应该是零。 否则,您可能需要考虑添加常量Unknown

有些人build议你不要为你的常量显式指定值。 在大多数情况下可能是好的build议,但有些情况下你会这样做:

  • 标志枚举

  • 其值与外部系统互相使用的枚举(例如COM)。

除非你有一个特定的理由去改变它,否则把枚举的默认值从零开始。

 public enum Status : byte { Inactive, Active } 

我会说最好的做法是不编号,让它隐含 – 这将从0开始。因为其隐含的语言偏好,总是很好的遵循:)

我会开始一个布尔types的枚举0。

除非“Inative”是指除“Inactive”之外的东西:)

这保留了这些标准。

我会说,这取决于你如何使用它们。 对于标记枚举是一个很好的做法,0为None值,如下所示:

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

当你的枚举可能被映射到一个数据库查找表时,我会从1开始。对于专业编写的代码应该不重要,但这会提高可读性。

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

不要分配任何数字。 只要使用它就像它应该使用。

如果你从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 }; 

除非有足够的理由使用原始值,否则只能使用隐式值并使用Status.ActiveStatus.Inactive引用它们。

问题在于,您可能希望将数据存储在平面文件或数据库中,或使用其他人创build的平面文件或数据库。 如果你自己做,那么编号应该符合Enum的用法。

如果数据不是你的,当然你会想要使用任何原始的开发者用作编号scheme。

如果您打算将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 。 〜0是0的二进制否定,并产生一个数字,每一位都设为1 , 表示值-1 。 对于复合标志(通常用于方便),可以使用按位或运算符|将其他值合并 。

如果没有指定编号从0开始。

由于枚举经常被序列化并存储为int,而不是string,所以明确是很重要的。

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

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

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

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

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

首先,除非你为某个原因指定了具体的值(数值在别的地方有意义,例如数据库或者外部服务),那么就根本不指定数值,而要明确。

其次,你应该总是有一个零值项(非标志枚举)。 该元素将被用作默认值。

除非有理由,例如将它们用作数组或列表的索引,或者还有其他一些实际的原因(比如在按位操作中使用它们),否则不要从0开始。

你的enum应该从需要的地方开始。 它也不一定是连续的。 这些值如果明确设定,则需要反映一些语义或实际考虑。 例如,“墙上的瓶子”的enum应该从1到99编号,而4的幂enum应该从4开始,并继续16,64,256等等。

而且,只有在代表一个有效状态的情况下,才可以为enum添加一个零值元素。 有时“无”,“未知”,“缺失”等是有效的值,但很多时候不是。

我喜欢开始我的枚举0,因为这是默认的,但我也想包括一个未知值,值为-1。 这然后成为默认值,有时可以帮助debugging。