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

C# 使用int作为枚举有什么意义,c#,enums,coding-style,C#,Enums,Coding Style,为什么很多人这样做枚举: public enum EmployeeRole { None = 0, Manager = 1, Admin = 2, Operator = 3 } 而不仅仅是做: public enum EmployeeRole { None, Manager, Admin, Operator } 有什么好处吗?它有助于避免仅仅因为有人重新安排了类而更改这些假定为常量的值。假设您有一位新员工决定“无”应排在列表的后面: public enum E

为什么很多人这样做枚举:

public enum EmployeeRole
{
  None = 0,
  Manager = 1,
  Admin = 2,
  Operator = 3
}
而不仅仅是做:

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

有什么好处吗?

它有助于避免仅仅因为有人重新安排了类而更改这些假定为常量的值。假设您有一位新员工决定“无”应排在列表的后面:

public enum EmployeeRole
{
  Manager,
  Admin,
  Operator,
  None
}
好吧,如果你只是从EmployeeRole直接访问这些值的话。不管怎样,这不是什么大问题。但我见过的大多数枚举在数据库中持久化时,在某个点上会转换为整数值。这意味着存储中所有的“无”元素都被转换为“管理器”

如果有人仅仅在管理员和操作员之间插入一个新的EmployeeRole,同样的问题也会出现

另一个优点是当你不认为你的枚举有一个合适的“默认”值时。例如,如果有人忘记映射ORM中的EmployeeRole字段,则从存储库中提取的对象将始终显示为具有

None
角色(0始终是枚举的默认值)。根据您的软件如何处理
None
,这类错误可能会在一段时间内消失。但如果你这样做:

public enum EmployeeRole
{
  Manager = 1,
  Admin = 2,
  Operator = 3
}
。。。然后将其与fail fast技术相结合,您可以快速捕获提供无效“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.
}

它明确定义一个值,而不是让编译器在编译时处理它。在您提供的示例中,它除了可读性和定义良好之外,没有其他意义。它不会伤害任何东西,并导致与未明确设置它们相同的MISL。但是,如果枚举与特定值相关,而这些值并不像上面的情况那样自动递增,那么这种显式定义非常方便

public enum MyEnum
{

    First = 1,
    Second = 2,
    Eleventh = 11

}

当您在其他地方有合同时,它很有用。如果将枚举存储在数据库中,您需要显式地键入数字,以确保不会在中间插入新项,从而意外地枚举枚举。< /P> 有优势吗

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

清晰。明确是一件好事。让我们再说一遍,我们从某个遗留应用程序中读取数据库中的整数。因此,这些代码已经有了特定的含义,我们希望明确地与它们一致。我们可以说

public enum EmployeeRole {
    None,
    Manager,
    Admin,
    Operator
}
public enum EmployeeRole {
    None = 0,
    Manager = 1,
    Admin = 2,
    Operator = 3
}
也许这完全符合遗留规范,或者我们可以说

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

现在更容易理解我们是否符合传统规范。

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

我看到了两个主要优点:

  • 给出一个与其他值重新关联的值(如数据库值、间隔等)。请注意,您不需要给出有序值。例如,它可以是1、23、2和4
  • 当您需要数字值时,它更具可读性

而且,“None”几乎应该始终为零,以便枚举类型的字段被初始化为合理的默认值。@Eric Lippert:是的,假设您有合理的默认值。(请参阅我的编辑)我假设不存储枚举的字符串值,而是存储关联的整数是正常的?我通常只是存储字符串值。这仅仅是因为浪费字节而导致的糟糕做法吗?这显然是问题的正确答案,但我想补充一点,我真的不认为在数据库中存储枚举值是一个好主意。请参阅:我假设不存储枚举的字符串值,而是存储一个关联的整数,这是一种规范?我通常只是存储字符串值。这仅仅是因为浪费字节而导致的糟糕做法吗?——