为什么很多人都这样做:
public enum EmployeeRole
{
None = 0,
Manager = 1,
Admin = 2,
Operator = 3
}
而不仅仅是:
public enum EmployeeRole
{
None,
Manager,
Admin,
Operator
}
有优势吗?
答案 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)
我看到两个主要优点: