想象一下,我定义了以下枚举:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
使用枚举的最佳做法是什么?它应该以{{1}}开头,如上例所示,还是以1
开头(没有显式值),如下所示:
0
答案 0 :(得分:151)
执行在非标记枚举上提供零值 如果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.Active
和Status.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
。 ~0
是0
的二进制否定,并且会产生一个数字,其每一位都设置为1
,which 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。这将成为默认值,有时可以帮助调试。