为什么很多人不枚举这种方式:什么是使用int的点作为枚举
public enum EmployeeRole
{
None = 0,
Manager = 1,
Admin = 2,
Operator = 3
}
,而不是仅仅做:
public enum EmployeeRole
{
None,
Manager,
Admin,
Operator
}
是否有优势?
为什么很多人不枚举这种方式:什么是使用int的点作为枚举
public enum EmployeeRole
{
None = 0,
Manager = 1,
Admin = 2,
Operator = 3
}
,而不是仅仅做:
public enum EmployeeRole
{
None,
Manager,
Admin,
Operator
}
是否有优势?
有优势吗?
可维护性。假设这些整数值最终保存在数据库中。您不希望在将来为枚举添加新值,并且由于您以一种移动未指定值的方式插入值,因此值会更改。
清晰度。显性是一件好事。我们再说一遍,我们正在从一些遗留应用程序的数据库中读取整数。所以代码已经有了特定的含义,我们希望明确地与它们对齐。我们可以说
public enum EmployeeRole {
None,
Manager,
Admin,
Operator
}
,也许将各行正好与原有规范,或者我们可以说
public enum EmployeeRole {
None = 0,
Manager = 1,
Admin = 2,
Operator = 3
}
,现在它更容易阅读,我们是否不排队与原有规范。
它有助于避免因为有人重新排列类而让这些假定的常量值发生变化。假设你有一个新员工,其判定“无”应该在列表后面:
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.
}
它清楚地表达定义了一个值,而不是让编译器在编译时处理它。在你提供的情况下,除了可读性和定义明确以外,它确实没有任何意义。它不会伤害任何东西,并导致相同的MISL中没有明确设置它们。但是,如果您的枚举与特定值相关,而这些值并不像上述情况那样自动递增,则这种明确的定义非常方便。
public enum MyEnum
{
First = 1,
Second = 2,
Eleventh = 11
}
当你有一个合同的其他地方是非常有用的。如果将枚举存储在数据库中,则需要明确键入数字,以确保不会在中间插入新项目而意外重新枚举枚举。
例如,当您将值存储在数据库中时,建议在数字和符号值之间有固定映射。如果你不明确指定数值,编译器会按顺序给它们编号,所以如果你插入一个新的,你会有一个不匹配。
我看到两个主要优点:
此外,“无”应该几乎总是为零,以便枚举类型的字段被初始化为合理的默认值。 – 2011-02-10 19:33:57
@Eric Lippert:是的,假设你有一个合理的默认值。 (请参阅我的编辑) – StriplingWarrior 2011-02-10 19:40:59