编号枚举与UnNumbered枚举

时间:2014-02-05 05:07:09

标签: c#

鉴于这两个枚举:

public enum test
{
    one = 1,
    two,
    three
}

public enum test2
{
    zero = 0,
    one = 1,
    two = 2,
    three = 3
}

我更喜欢使用第一种方法。我看到很多开源项目和代码在我的工作中使用第二种方法,其中每个项目都有一个值。我很少看到第一个编码的例子。是否有一个原因?为什么第二种方法比第一种方法更受欢迎?此外,您可以将此问题的标题更改为更合适的标题,因为我不确定如何说出此问题

5 个答案:

答案 0 :(得分:2)

第二个更安全,可用于序列化。想到的一个例子是WCF。实际上,如果您尝试使用未初始化的枚举成员传递对象,则WCF中的血清化会抛出异常。

答案 1 :(得分:2)

不确定您的问题是否有规范的答案,但我敢说,第二种方法的优势在于,如果某人删除了特定值,则事情不会自动重新编号。在第一个示例中,如果有人删除two,则three的值会突然变为2。不太好......

答案 2 :(得分:2)

枚举元素具有名称和值。几乎所有关于控制值。有大量的枚举用法,其中一些用法关注值

以下是一些例子:

  • 如果使用XmlSerializer,则元素名称(文本)用于存储属性的值。在这里,你不关心价值观。
  • 如果将结果保存在数据库中,则不太可能使用文本字段和解析,但更可能是数字字段。因此枚举被保存为元素值。这是您关心它们的地方,因为更新枚举(向其添加新元素)可能使已保存在数据库中的值无效。
  • 如果您正在使用位域,或者实际上将枚举值分组为常量(枚举可以用作常量的并集来对它们进行分组,例如, iTextSharp有大量未分组的常量,这使得很难找到所需的常量;如果他们有类别或枚举,可以容纳它们 - 这会更容易),然后你关心价值观。

实际上,已知有关编译器如何为枚举元素赋值的规则。所以,例如,如果你有这个枚举

public enum test
{
    one,
    two,
    three
}

然后,只要您需要向其添加fouroneandhalf,就可以像这样添加

public enum test
{
    one,
    two,
    three,
    four,
    oneandhalf
}

或者像这样

public enum test
{
    one = 0,
    oneandhalf = 4,
    two = 1,
    three = 2,
    four = 3,
}

并且您仍然保持向后兼容性(以前保存在数据库中的值在更新后都可以)。请注意,当插入元素存在于现有元素之间或bad之间时,您必须明确指定值。

答案 3 :(得分:0)

因为我们也可以使用第二种方法如下

public enum test2
{
    zero = 0,
    one = 5,
    two = 10,
    three = 20
}

所以我们可以用不同的间隔分配不同的值,只能通过第二种方式...

答案 4 :(得分:0)

考虑以下2个枚举,您将看到哪个更易于解释:

public enum numbers
{
    one = 5,
    hundred = 100,
    thousand = 1000
}

public enum numbers
{
    one,
    hundred,
    thousand
}

你仍然可以使用第二种方法,但我相信你会看到可能出现的潜在问题。