我有许多枚举,其中包含不时更改的长列表
public MyEnumType MyEnum
{
None = 0,
Option1 = 1,
Option2 = 2,
etc..
}
当他们改变时,我需要重新编号索引,因为在现有选项之间总是有新的选项。
问题是,如果删除索引,枚举是否总是从上到下遵守订单?
public MyEnumType MyEnum
{
None,
Option1,
Option2,
etc..
}
提前致谢。
答案 0 :(得分:6)
是的,他们会的。 如果要确保值以某个特定值开始,您还可以仅指定第一个元素:
public MyEnumType MyEnum
{
None = 1,
Option1, // -> 2
Option2, // -> 3
}
有关其他详情,请查看the docs。
请注意,在大多数情况下,您的代码不应该关心确切的数值。 您照顾的情况例如是如果你声明一个enum是外部类型的别名(例如interop),那么你需要确保值是相同的。另一种情况是,当枚举表示二进制标志时,您需要以下内容:
[Flags]
public MyEnumType MyEnum
{
None = 1,
Option1 = 2,
Option2 = 4
}
答案 1 :(得分:3)
最简单的答案是“是”......他们将永远遵守命令。
所以你不需要输入索引号。
public MyEnumType MyEnum
{
None,
OptionA,
OptionB,
OptionC,
...
...
OptionZ
}
这将始终与 -
相同public MyEnumType MyEnum
{
None = 0,
OptionA = 1,
OptionB = 2,
OptionC = 3,
...
...
OptionZ = 26
}
如果你介绍新的枚举类型,如 -
public MyEnumType MyEnum
{
None,
OptionA,
OptionB,
OptionC,
...
...
OptionO
OptionNew
OptionP
...
...
OptionZ
}
然后上面将相当于 -
public MyEnumType MyEnum
{
None = 0,
OptionA = 1,
OptionB = 2,
OptionC = 3,
...
...
OptionO = 15
OptionNew = 16
OptionP = 17
...
...
OptionZ = 27
}
答案 2 :(得分:1)
是的,他们尊重订单,从int的默认值开始,为零。
如果您经常重新编号,那么最好明确地为枚举成员分配值,然后在基于它的基础列表发生更改时重新编号。
如果您使用显式编号,那么您也可以随时在现有项目的列表中插入新项目,但您需要注意不要将两个项目分配给相同的值(这完全合法) C#,但如果你没有意图,可能会产生错误。)
答案 3 :(得分:1)
来自C# language specification 1.10 Enums
:
...当枚举成员声明没有明确指定值时, 该成员的值为零(如果它是第一个成员) 枚举类型)或文本上前面的枚举成员加的值 之一。
与此处的明确声明相同:
public MyEnumType MyEnum
{
None = 0,
Option1 = 1,
Option2 = 2,
etc..
}
答案 4 :(得分:1)
默认情况下,他们将按照声明的顺序从零开始计数 如果明确定义一个,则后续值继续向上计数,使用显式值作为种子。