想象一下,我定义了以下枚举:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
使用枚举的最佳实践是什么?它应该1
以上述示例开头还是以0
(没有显式值)开头,如下所示:
public enum Status : byte
{
Inactive,
Active
}
想象一下,我定义了以下枚举:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
使用枚举的最佳实践是什么?它应该1
以上述示例开头还是以0
(没有显式值)开头,如下所示:
public enum Status : byte
{
Inactive,
Active
}
Answers:
✔️对于简单的枚举,请提供零值。
考虑将值称为“无”。如果此值不适用于此特定枚举,则应为枚举的最常见默认值分配基础值为零。
❌避免使用标志枚举值零,除非该值表示“所有标志均已清除”并已正确命名(如下一准则所规定)。
✔️不要将标志枚举的零值命名为None。对于标志枚举,该值必须始终表示“已清除所有标志”。
switch
语句中它将跳到该default
部分,在该部分我抛出InvalidEnumArgumentException
。否则,程序可能会无意中以枚举的零值继续运行,该值可能是有效的且未被注意。
好吧,我想我不同意大多数答案,即未明确编号。我总是对它们进行明确编号,但这是因为在大多数情况下,我最终将它们持久存储在数据流中,并将它们存储为整数值。如果没有显式添加值,然后添加新值,则可能会破坏序列化,从而无法准确加载旧的持久对象。如果您打算对这些值进行任何类型的持久性存储,那么我强烈建议您明确设置这些值。
Enum是一种值类型,如果未显式初始化,则其默认值(例如,对于类中的Enum字段)将为0。
因此,您通常希望将0作为定义的常量(例如,未知)。
在您的示例中,如果要Inactive
使用默认值,则其值应为零。否则,您可能要考虑添加一个常量Unknown
。
有人建议您不要为常量明确指定值。在大多数情况下,这可能是很好的建议,但是在某些情况下,您可能需要这样做:
标志枚举
枚举,其值与外部系统(例如COM)互操作使用。
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
,比方法更具可读性[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
。)
[Flags] enum MyFlags { None=0, A, B, C }
会导致[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
,而对于Flags枚举,通常需要C = 4。
我要说的最佳实践是不对它们进行编号,并使其为隐式-将从0开始。由于其隐式是其语言偏好,因此总是可以遵循的:)
除非你有一个很好的理由使用原始值,你应该永远只能是使用隐式值与引用它们Status.Active
和Status.Inactive
。
问题是您可能希望将数据存储在平面文件或DB中,或者使用其他人创建的平面文件或DB。如果您自己制作,请进行制作,以使编号适合使用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
,它表示的值-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
};
首先,除非您出于某种原因指定了特定的值(数字值在其他地方具有含义,即数据库或外部服务),否则根本不要指定数字值并使它们明确。
其次,您应该始终有一个零值项目(在非标志枚举中)。该元素将用作默认值。
我喜欢将枚举值从0开始,因为这是默认值,但是我也喜欢包含一个值为-1的Unknown值。这将成为默认值,有时可以帮助调试。