2011-02-10 30 views
7

为什么很多人不枚举这种方式:什么是使用int的点作为枚举

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

,而不是仅仅做:

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

是否有优势?

回答

4

有优势吗?

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

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

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

,也许将各行正好与原有规范,或者我们可以说

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

,现在它更容易阅读,我们是否不排队与原有规范。

0

它有助于避免因为有人重新排列类而让这些假定的常量值发生变化。假设你有一个新员工,其判定“无”应该在列表后面:

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

好吧,如果你永远只能直接从EmployeeRole.Whatever访问这些价值观,这不是一个巨大的交易。但是我看到的大多数枚举在某些时候被转换为一个整数值,当它们被保存在数据库中时。这意味着存储中的所有“无”元素都已转换为“经理”。

如果有人仅仅在管理员和操作员之间插入新的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. 
} 
+1

此外,“无”应该几乎总是为零,以便枚举类型的字段被初始化为合理的默认值。 – 2011-02-10 19:33:57

+0

@Eric Lippert:是的,假设你有一个合理的默认值。 (请参阅我的编辑) – StriplingWarrior 2011-02-10 19:40:59

1

它清楚地表达定义了一个值,而不是让编译器在编译时处理它。在你提供的情况下,除了可读性和定义明确以外,它确实没有任何意义。它不会伤害任何东西,并导致相同的MISL中没有明确设置它们。但是,如果您的枚举与特定值相关,而这些值并不像上述情况那样自动递增,则这种明确的定义非常方便。

public enum MyEnum 
{ 

    First = 1, 
    Second = 2, 
    Eleventh = 11 

} 
2

当你有一个合同的其他地方是非常有用的。如果将枚举存储在数据库中,则需要明确键入数字,以确保不会在中间插入新项目而意外重新枚举枚举。

0

例如,当您将值存储在数据库中时,建议在数字和符号值之间有固定映射。如果你不明确指定数值,编译器会按顺序给它们编号,所以如果你插入一个新的,你会有一个不匹配。

0

我看到两个主要优点:

  • 给予被realated别的东西(如数据库值,时间间隔等)的值。请注意,您不需要提供有序的值。例如,它可能是1,23,2和4。
  • 当您需要数字值时,它更具可读性。