2012-05-15 162 views
6

我有一组值代表一个状态(ON,OFF,READY,...)。这些值也作为int字段存储在数据库中,所以我想知道是否最佳实践会说这是一个枚举或者只是一堆类的const int类型。它看起来像隐藏了一个事实,即重要的值映射到哪个整数(否则从DB中检索的值将被实例化为不正确的状态)。稍后有人可能会进来,为枚举或其他东西添加一个新的值,然后抛弃所有的东西。C#枚举或int常量

哪种方法更好?

+1

对于整数也是如此!您可以为每个枚举设置所需的值,并且编译器会强制执行(一点点)您的代码。至少你不能写:myVar.MyEnum = 12345; –

+1

我会举'enum'为例。 Pi是一个常数,光的速度也是如此。根据我的愚见,你的这一套国家不是。 – Ste

回答

10

我认为enum仍然是可读性的最佳选择。然而,由于它的值存储在数据库中,你应该明确地指定值:

enum State { On = 1, Off = 2, Ready = 3}; 
+0

+1 @OxedFrederik不只是声明**枚举,而是在你的模型中**检查**它是有效的。您可以将任何整数转换为枚举。我个人喜欢Kevin发布的解决方案。 –

0

您可以自己确定值枚举过,即:

enum STATE {ON=2, OFF=9, READY=14}; 
3

如何被某人添加新的枚举值不同于一个新的常量int?

请记住,您可以将枚举设置为特定的整数值。

拥抱可读性!

作为额外的奖励,你现在可以使用强类型,以防止恶作剧像

Widget.state = 474; 

如果474不对应于你的数据库的状态。

+0

这是事实,但这种类型的事情最不稳定的地方是发生序列化的应用程序边界。这意味着你最终得到像'Widget.state =(StateEnum)stateId'这样的语句,如果'stateId'是'StateEnum'中的一个有效值,并且C#会** **不关心**,并且**不抛出异常if 'stateId'是474. – Nick

+0

@Nick是的,消毒您的输入。 [甚至有枚举方法可以帮助完成此操作。](https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

我会去与一个枚举,并确保它非常好地记录枚举相应的表。

一堆const int的危险在于该类型并不表示有效值是什么,有人可以很容易地分配任何旧值。你的代码的恶意用户仍然可以通过演员完成该操作,但是你不能阻止一些人自己拍摄自己的脚......

0

我想说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); 
1

如果值很少会发生变化,或者如果你有编辑和重新编译代码没有问题,那么请务必使用一个枚举与每个整数值的显式声明。否则,我会创建一个从数据库中提取值的对象包装器(如果您担心性能,可以总是缓存这些值)。然后做所有与对象包装器的比较。除非您可以确保数据库中的值不会更改,而代码中的枚举更新代码只是不稳定且有风险。如果你真的冒险,想要发布代码,那么你可以做一些非常酷的事情。