使用int作为枚举有什么意义

时间:2011-02-10 19:24:43

标签: c# enums coding-style

为什么很多人都这样做:

public enum EmployeeRole
{
  None = 0,
  Manager = 1,
  Admin = 2,
  Operator = 3
}

而不仅仅是:

public enum EmployeeRole
{
  None,
  Manager,
  Admin,
  Operator
}

有优势吗?

6 个答案:

答案 0 :(得分:4)

  

有优势吗?

可维护性。假设这些整数值最终持久存储在数据库中。您不希望将来向枚举添加新值,并且值会更改,因为您以改变未指定值的方式插入值。

净度。显性是一件好事。让我们再说一遍,我们从一些遗留应用程序中读取数据库中的整数。因此代码已经具有特定含义,我们希望明确地与它们对齐。我们可以说

public enum EmployeeRole {
    None,
    Manager,
    Admin,
    Operator
}

也许这与传统规范完全一致,或者我们可以说

public enum EmployeeRole {
    None = 0,
    Manager = 1,
    Admin = 2,
    Operator = 3
}

现在更容易阅读我们是否与传统规范保持一致。

答案 1 :(得分:2)

当你在其他地方签订合同时,它很有用。如果将枚举存储在数据库中,则需要明确键入数字,以确保不会通过在中间插入新项目来重新编号枚举。

答案 2 :(得分:1)

它explicits定义一个值,而不是让编译器在编译时处理它。在您提供的情况下,除了可读性和明确定义之外,它实际上没有任何意义。它不会伤害任何东西并导致相同的MISL,因为没有明确设置它们。但是,如果您的枚举与上述情况下未自动递增的特定值相关,则此类显式定义非常方便。

public enum MyEnum
{

    First = 1,
    Second = 2,
    Eleventh = 11

}

答案 3 :(得分:0)

它有助于避免让这些所谓的常量值发生变化,因为有人重新排列了这个类。假设您有一名新员工决定将“无”放在列表的后面:

public enum EmployeeRole
{
  Manager,
  Admin,
  Operator,
  None
}

好吧,如果您只是直接从EmployeeRole访问这些值。无论如何,这不是什么大不了的事。但是,我看到的大多数枚举在某些时候被转换为整数值,当它们被保存在数据库中时。这意味着存储中的所有“无”元素都转换为“管理器”。

如果有人仅在管理员和运营商之间插入新的EmployeeRole,则会出现同样的问题。

当您不认为枚举的适当“默认”值时,会出现另一个优点。例如,如果有人忘记在ORM中映射EmployeeRole字段,则从存储库中提取的对象似乎总是具有None角色(0始终是枚举的默认值)。根据您的软件处理None的方式,这种错误可能会持续一段时间。但如果你这样做:

public enum EmployeeRole
{
  Manager = 1,
  Admin = 2,
  Operator = 3
}

...然后将其与快速失败技术相结合,您可以快速捕获提供无效“0”值的错误:

public RightsManager GetByEmployeeRole(EmployeeRole role)
{
    Require.That(role.IsDefined()); // throws an exception if role is not defined.
    // find the rights manager for this role.
}

答案 4 :(得分:0)

例如,在数据库中存储值时,建议在数字和符号值之间建立固定的映射。如果未明确指定数值,编译器将按顺序对它们进行编号,因此如果插入新数字,则会出现不匹配。

答案 5 :(得分:0)

我看到两个主要优点:

  • 提供与其他内容相关的值(如数据库值,间隔等)。请注意,您无需提供有序值。例如,它可以是1,23,2和4。
  • 当您需要数值时,它更具可读性。