1

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

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

当它们发生变化时,我需要重新编号索引,因为新选项总是放置在现有选项之间。

问题是,如果我删除索引,枚举会始终遵守从上到下的顺序吗?

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

提前致谢。

4

5 回答 5

6

是他们会。如果要确保值从某个特定值开始,也可以仅指定第一个元素:

public MyEnumType MyEnum
{
    None = 1,
    Option1, // -> 2
    Option2, // -> 3
}

有关其他详细信息,请查看文档

请注意,在大多数情况下,您的代码不应该关心确切的数值。需要注意的情况是,例如,如果您声明一个枚举,它是外部类型(例如互操作)的别名,因此您需要确保值相同。另一种情况是当枚举表示二进制标志时,您需要类似:

[Flags] 
public MyEnumType MyEnum
{
    None = 1,
    Option1 = 2,
    Option2 = 4
}
于 2013-06-04T09:06:41.927 回答
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
}
于 2013-06-04T09:06:04.040 回答
1

是的,他们遵守订单,从 int 的默认值开始,即零。

如果您定期对事物重新编号,那么最好将值显式分配给枚举成员,然后在它所基于的基础列表发生变化时对项目重新编号。

如果您使用显式编号,那么您也可以随时将新项目插入现有项目之间的列表中,尽管您需要注意不要将两个项目分配给相同的值(这在 C# 中是完全合法的,但是如果您不打算这样做,可能会产生错误)。

于 2013-06-04T09:08:54.523 回答
1

C# 语言规范1.10 Enums

...当枚举成员声明未明确指定值时,该成员的值为零(如果它是枚举类型中的第一个成员)或文本前面的枚举成员的值加一。

因此,与您在此处的显式声明相同:

public MyEnumType MyEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    etc..
}
于 2013-06-04T09:10:21.427 回答
1

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

于 2013-06-04T09:11:45.597 回答