枚举需要索引吗?

时间:2013-06-04 09:04:43

标签: c# enums

我有许多枚举,其中包含不时更改的长列表

public MyEnumType MyEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    etc..
}

当他们改变时,我需要重新编号索引,因为在现有选项之间总是有新的选项。

问题是,如果删除索引,枚举是否总是从上到下遵守订单?

public MyEnumType MyEnum
{
    None,
    Option1,
    Option2,
    etc..
}

提前致谢。

5 个答案:

答案 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)

默认情况下,他们将按照声明的顺序从零开始计数 如果明确定义一个,则后续值继续向上计数,使用显式值作为种子。