我有一组值代表一个状态(ON,OFF,READY,...)。这些值也作为int字段存储在数据库中,所以我想知道是否最佳实践会说这是一个枚举或者只是一堆类的const int类型。它看起来像隐藏了一个事实,即重要的值映射到哪个整数(否则从DB中检索的值将被实例化为不正确的状态)。稍后有人可能会进来,为枚举或其他东西添加一个新的值,然后抛弃所有的东西。C#枚举或int常量
哪种方法更好?
我有一组值代表一个状态(ON,OFF,READY,...)。这些值也作为int字段存储在数据库中,所以我想知道是否最佳实践会说这是一个枚举或者只是一堆类的const int类型。它看起来像隐藏了一个事实,即重要的值映射到哪个整数(否则从DB中检索的值将被实例化为不正确的状态)。稍后有人可能会进来,为枚举或其他东西添加一个新的值,然后抛弃所有的东西。C#枚举或int常量
哪种方法更好?
我认为enum
仍然是可读性的最佳选择。然而,由于它的值存储在数据库中,你应该明确地指定值:
enum State { On = 1, Off = 2, Ready = 3};
+1 @OxedFrederik不只是声明**枚举,而是在你的模型中**检查**它是有效的。您可以将任何整数转换为枚举。我个人喜欢Kevin发布的解决方案。 –
您可以自己确定值枚举过,即:
enum STATE {ON=2, OFF=9, READY=14};
如何被某人添加新的枚举值不同于一个新的常量int?
请记住,您可以将枚举设置为特定的整数值。
拥抱可读性!
作为额外的奖励,你现在可以使用强类型,以防止恶作剧像
Widget.state = 474;
如果474不对应于你的数据库的状态。
这是事实,但这种类型的事情最不稳定的地方是发生序列化的应用程序边界。这意味着你最终得到像'Widget.state =(StateEnum)stateId'这样的语句,如果'stateId'是'StateEnum'中的一个有效值,并且C#会** **不关心**,并且**不抛出异常if 'stateId'是474. – Nick
@Nick是的,消毒您的输入。 [甚至有枚举方法可以帮助完成此操作。](https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin
我会去与一个枚举,并确保它非常好地记录枚举相应的表。
一堆const int的危险在于该类型并不表示有效值是什么,有人可以很容易地分配任何旧值。你的代码的恶意用户仍然可以通过演员完成该操作,但是你不能阻止一些人自己拍摄自己的脚......
我想说Enums。他们给你一个机器格式的选项,以人类可读的格式。请确保以非常好的方式记录它
///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开始,其余的将自动增加。
由于您的枚举是关于开/关,您可以使用它以布尔方式。 0代表False或off,1代表true或on。
您也可以将您的枚举为int喜欢以int数据库
int value = (int)State.On; // value will have 1
保存价值。同时检索,你可以做这样的
State st = (State)int.Parse(mydatabasevalue);
如果值很少会发生变化,或者如果你有编辑和重新编译代码没有问题,那么请务必使用一个枚举与每个整数值的显式声明。否则,我会创建一个从数据库中提取值的对象包装器(如果您担心性能,可以总是缓存这些值)。然后做所有与对象包装器的比较。除非您可以确保数据库中的值不会更改,而代码中的枚举更新代码只是不稳定且有风险。如果你真的冒险,想要发布代码,那么你可以做一些非常酷的事情。
对于整数也是如此!您可以为每个枚举设置所需的值,并且编译器会强制执行(一点点)您的代码。至少你不能写:myVar.MyEnum = 12345; –
我会举'enum'为例。 Pi是一个常数,光的速度也是如此。根据我的愚见,你的这一套国家不是。 – Ste