我有一组代表状态的值(ON,OFF,READY,...)。这些值也作为 int 字段存储在数据库中,所以我想知道最佳实践是否会说使其成为枚举或只是类上的一堆 const int 类型。
枚举似乎很适合人类阅读/编码,但它似乎隐藏了一个事实,即值映射到哪些整数很重要(否则从数据库检索的值将被实例化为不正确的状态)。稍后有人可能会进来,为枚举或其他东西添加一个新值,然后把整个事情扔掉。
哪种方法更好?
我有一组代表状态的值(ON,OFF,READY,...)。这些值也作为 int 字段存储在数据库中,所以我想知道最佳实践是否会说使其成为枚举或只是类上的一堆 const int 类型。
枚举似乎很适合人类阅读/编码,但它似乎隐藏了一个事实,即值映射到哪些整数很重要(否则从数据库检索的值将被实例化为不正确的状态)。稍后有人可能会进来,为枚举或其他东西添加一个新值,然后把整个事情扔掉。
哪种方法更好?
我认为enum
仍然是可读性的最佳选择。但是,由于它的值存储在数据库中,您应该明确指定值:
enum State { On = 1, Off = 2, Ready = 3};
有人添加新的枚举值与新的常量 int 有何不同?
请记住,您可以将枚举设置为特定的整数值。
拥抱可读性!
作为额外的奖励,您现在可以使用强类型来防止恶作剧,例如
Widget.state = 474;
其中 474 与数据库中的状态不对应。
我会使用枚举并确保它很好地记录了枚举对应的表。
一堆 const int 的危险在于,该类型没有传达有效值是什么的指示,并且有人可以很容易地分配任何旧值。您的代码的恶意用户仍然可以通过强制转换来做到这一点,但您无法阻止某些人在自己的脚下开枪......
如果您的值很少会改变,或者如果您在编辑和重新编译代码方面没有问题,那么请确保使用枚举并明确声明每个整数值。否则,我将创建一个从数据库中提取值的对象包装器(如果您担心性能,您可以随时缓存这些值)。然后与该对象包装器进行所有比较。除非您可以确保数据库中的值不会在不使用代码中的枚举更新代码的情况下发生变化,否则这只是易变且有风险的。如果你真的很喜欢冒险并且想开始发布代码,你可以用它做一些很酷的事情。
您也可以自己确定 Enum 中的值,即:
enum STATE {ON=2, OFF=9, READY=14};
我会说枚举。它们为您提供了将机器格式转换为人类可读格式的选项。确保以这种方式很好地记录它
///Summary
/// About State Enum
///Summary
enum State : int
{
///Summary
/// About Off Enum Value
///Summary
Off = 0,
///Summary
/// About On Enum Value
///Summary
On,
///Summary
/// About Ready Enum Value
///Summary
Ready
};
无需为每个成员分配价值。从 0 开始,rest 将自动递增。
由于您的枚举是关于开/关的,因此您可以以布尔方式使用它。0 代表假或关,1 代表真或开。
您还可以将您的枚举转换为 int
int value = (int)State.On; // value will have 1
将数据库中的值保存为 int。在检索时你可以这样做
State st = (State)int.Parse(mydatabasevalue);