假设我已经定义了以下枚举:
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
}
Framework Design Guidelines(框架设计准则):
✔️ 在简单的枚举类型中提供零值。
如果这个值在该枚举类型中不恰当,可以考虑称其为“None”。对于该枚举类型最常见的默认值应该赋予底层零值。
Framework Design Guidelines / Designing Flag Enums(框架设计准则 / 设计 Flag 枚举类型):
❌ 避免使用枚举类型中零值,除非该值表示“所有标志都已清除”并命名得当,如下一条指南所述。
✔️ 将 Flag 枚举类型的零值命名为 None。对于 Flag 枚举,该值必须始终表示“所有标志都已清除”。
switch
语句中,它将跳转到“default”部分,在那里我会抛出一个InvalidEnumArgumentException
。否则,程序可能会无意中继续运行具有枚举的零值,这可能是有效的,却不被注意到。 - Allon GuralnekNone = 0
;这样可以通过 if(value == MyFlags.None){ return; }
等方式来进行代码早期中止。 - BrainSlugs83嗯,我认为我与大多数回答不同,他们说不要明确地编号它们。我总是明确地给它们编号,但这是因为在大多数情况下,我最终将它们持久化到一个数据流中,存储为整数值。如果您不明确添加值并添加新值,则可能会破坏序列化,然后无法准确地加载旧的持久化对象。如果您要对这些值进行任何类型的持久存储,那么我强烈建议显式设置这些值。
枚举是值类型,如果未显式初始化,则其默认值(例如类中的枚举字段)将为0。
因此,您通常希望将0作为已定义的常量(例如Unknown)。
在您的示例中,如果想将Inactive
作为默认值,则应将其值设置为零。否则,您可能需要考虑添加一个常量Unknown
。
有些人建议不要明确指定常量的值。在大多数情况下这是个好建议,但某些情况下你需要这样做:
标志(Flags)枚举
其值用于与外部系统(例如COM)之间的交互的枚举。
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
比[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
更易读。) - BrainSlugs83[Flags] enum MyFlags { None=0, A, B, C }
将导致[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
,而对于 Flags 枚举,通常希望 C=4。 - Joe除非你有特定的原因需要更改它,否则请将枚举保留其默认值,这些默认值从零开始。
public enum Status : byte
{
Inactive,
Active
}
Status.Active
和Status.Inactive
。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用作None
值是一个好习惯,像这样:
[Flags]
enum MyEnum
{
None = 0,
Option1 = 1,
Option2 = 2,
Option3 = 4,
All = Option1 | Option2 | Option3,
}
public enum Status : byte
{
Inactive = 1,
Active
}
我认为最好的做法是不给它们编号,让它隐式地从0开始。由于它是隐式的,因此遵循语言首选项始终是个好习惯 :)
我会从0开始一个布尔类型的枚举。
除非"Inative"意味着与"Inactive"不同的含义 :)
这将保持标准化。
{
BOX_THING1 = 1,
BOX_THING2 = 2,
BOX_NUM_THING = BOX_THING2
};
{
BOX_NO_THING = 0,
BOX_THING1 = 1,
BOX_THING2 = 2,
BOX_NUM_THING = BOX_THING2
};