.net 为什么要为枚举声明数值?

.net 为什么要为枚举声明数值?,.net,enums,.net,Enums,我经常看到这样声明的简单(非标志)枚举: enum Something { Thingy = 1, Thangamijig = 2, Whatsit = 3 } 为什么包含可选的数值?这被认为是最佳实践吗 政府似乎没有解释这样做的原因 我刚刚想到了一个可能的答案:如果要修改枚举(比如通过重新排序值或插入新值),是否可以确保包含枚举实例的先前序列化对象不会变得无效或其含义不会改变 这似乎是有道理的。还有其他原因吗?能够指定特定值对于与另一个无法访问C#中定义的类型的系统的

我经常看到这样声明的简单(非标志)枚举:

enum Something
{
    Thingy = 1,
    Thangamijig = 2,
    Whatsit = 3
}
为什么包含可选的数值?这被认为是最佳实践吗

政府似乎没有解释这样做的原因

我刚刚想到了一个可能的答案:如果要修改枚举(比如通过重新排序值或插入新值),是否可以确保包含枚举实例的先前序列化对象不会变得无效或其含义不会改变


这似乎是有道理的。还有其他原因吗?

能够指定特定值对于与另一个无法访问C#中定义的类型的系统的互操作性非常有用


例如,COM程序或外部web服务可能会为您选择在C#中表示为枚举的属性定义某些数值。

如果您要在外部保存这些值(如数据库),并希望将其值映射回代码,这一点非常重要

如果未显式分配,则将在编译时按顺序设置它们


例如:

enum Something
{
    Thingy,
    Thangamijig,
    Whatsit
}
所以
Thingy==0
Thanamijig==1
Whatsit==2

使用此枚举并将其保存到数据库中一段时间,然后其他开发人员发现
某物的新用途并对其进行更改。。。差:

enum Something
{
    Whosits,
    Thingy,
    Thangamijig,
    Whatsit
}
现在
Thingy==1
Thanamijig==2
Whatsit==3
,您不再拥有正确的映射

这只是一种情况,如果不明确定义每个枚举值映射到的对象,可能会导致一个大问题


枚举元素的默认基础类型为int。默认情况下,第一个枚举数的值为0,每个后续枚举数的值增加1。例如:

enum天{周六、周日、周一、周二、周三、周四、周五}

在此枚举中,Sat为0,Sun为1,Mon为2,依此类推。枚举数可以使用初始值设定项覆盖默认值。例如:

enum天{Sat=1,星期一,星期二,星期三,星期四,星期五}


在该枚举中,元素序列被迫从1开始,而不是从0开始。

通常在与其他代码交互时。有时是具有预定义枚举值的硬件


有时人们用它们作为旗帜,值0,1,2,4。。。然后可以将它们组合成一个int。稍后可以根据枚举测试该int。

考虑一个更大的数据库

假设您有一个常量字符串数组,大约有250个字符串

但是,在代码的某些部分,您并不想使用所有这些字符串,例如,仅使用最后3个字符串。
此功能允许您执行以下操作:

enum LastThree
{
    Thingy = 247,
    Thangamijig = 248,
    Whatsit = 249
}

正如您所说,第一个也是最重要的原因是确保在更改枚举顺序时,并没有破坏任何内容

默认情况下,枚举以0开头,因此,如果您的变量应该具有某些值,则应该具有数值。有时,您会看到使用第一项的人将其视为无,因为它的值为0

使用number的另一个原因是,如果您正在使用,那么您没有选项,您必须使用值

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

当您将枚举值存储在某个位置时,这一点很重要,可能是数据库、配置文件等

想象一下,最初您有一个这样的枚举

enum TransactionType
{
  Debt,
  Deposit
}
并将ClientA的TransactionType存储为
TransactionType.Deposit
int value 1)存储在数据库中

后来,另一个开发人员添加了新类型,所以enum现在看起来像

enum TransactionType
{  
  NotAssigned,
  Debt,
  Deposit
}
所以,当应用程序从数据库(int==1)中读取ClientA的事务类型时,它就变成了
TransactionTYpe.Debt

ClientA会感到困惑,因为它不会在网上系统中看到存款,而是看到他有债务


为避免此类问题,您应该添加初始值。

也许可以接受更多您以前的答案?枚举通常可以表示程序之外的内容(其他程序/API/等的值),在这种情况下,您肯定希望您分配的名称与外部资源所期望的值(或标志)相等,埃里克J:我认为63%是可以接受的。不是所有的问题都有答案,也不是好答案。真的,任何超过50%线的东西都不会困扰我。好吧,看来我的序列化假设是主要原因,正如一些答案所确认的那样。但还有一些其他有趣的观点+1意味着所有的(到目前为止)。如果有人在列表中间插入枚举值而不知道数据库中的外部存储,则值可以随时间而改变。1关于外部系统的这一方面。你能举一个硬件例子吗?有趣的一点。所以在本例中,真正重要的是数值。我特别提到了非标志,但其他信息为+1。