这有助于避免仅仅因为有人重新排列类而改变这些所谓的常量值。假设您有一个新员工决定“无”应该放在列表的最后:
public enum EmployeeRole
{
Manager,
Admin,
Operator,
None
}
好吧,如果您只是直接从 EmployeeRole.Whatever 访问这些值,那也没什么大不了的。但是我见过的大多数枚举在保存在数据库中时都会在某些时候转换为整数值。这意味着您存储中的所有“None”元素都刚刚转换为“Manager”。
如果有人只是在 Admin 和 Operator 之间插入一个新的 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.
}