如果你的应用程序中有一个枚举而你只有几个项目,你应该强制基础类型是最小的类型吗?
enum smaller : byte
{
one,
two,
three
};
答案 0 :(得分:38)
没有。不要过早地优化,除非您已经通过分析器证明它实际上是一个问题。
答案 1 :(得分:28)
与最佳做法相关:
如果没有特别的理由让enum成为类型字节,则应将其保留为默认值。
无论何时在switch语句中使用枚举,都应该为无效的枚举值设置“default”子句。因此,如果要检查256-NumRealEnumValues或2 ^ 32-NumRealEnumValues,则无关紧要。两者都有一个处理所有无效案例的默认子句。
明确设置枚举类型的一个原因是,如果您希望枚举与程序中的其他类型相对应,则需要在它们之间显式转换。
将类型更改为最小版本也无法帮助您解决版本问题。除非您确实填写了枚举的最大大小。通过版本化问题,我的意思是当你使用枚举编译dll时,然后你添加一个新的枚举值,一些代码可能执行,而不是在switch语句的“default”子句中。
与效率相关:
在效率方面没有任何好处使它成为一个字节。
int的使用效率更高,因为x86上的cpu具有32位寄存器。复制到寄存器一次只能进行32位。
当你使用较小的类型时,你必须将寄存器的一部分归零并复制到寄存器的低阶位的其余部分。
答案 2 :(得分:8)
执行此操作的唯一原因是,如果您使用定义的协议存储或传输此值,该协议要求该字段具有该大小。
答案 3 :(得分:2)
会得到什么?您将节省大量3个字节的内存,但代价是执行速度稍慢,代码不太直观或易读。 (读到这个,我不得不怀疑pyou是否真的有理由让它成为一个字节,这个原因可能是什么。大概是你出于某种原因而不顾一切地使用非默认类型。)
如果您计划存储数百万这些东西,那么可以节省几个字节,这样可以获得回报。否则,没有。
这与您通常不使用byte或short而不是int的原因相同。
答案 4 :(得分:2)
如果要将模型与枚举映射到另一个模型,或者将其序列化,或者您的枚举被反映到数据库列 - 那么我建议您明确指定类型。
方案:
数据库中有一列:status_id
,类型为tinyint
。并且您的代码中包含了枚举:enum Status { Well = 1, Bad = 2 }
。你在某个实体中使用这个枚举。假设您使用实体框架核心2.0。如果您尝试从数据库读取/写入此实体,则会收到错误“无法转换对象”,除非您明确指定byte
类型。
答案 5 :(得分:0)
您不应该为枚举指定某个整数类型,而是让.NET环境为枚举找出最佳“大小”。正如JaredPar所说,如果你改变了数据类型,你肯定会检查它是否真的有用。
事实上,32位整数在x86处理器上是“自然的”,因为它们可以很容易地以最佳方式对齐。
答案 6 :(得分:0)
在.Net核心中,如果调用Enum.IsDefined来检查传入值是否存在于枚举中,则应确保类型相同。
ArgumentException:枚举基础类型和对象必须为相同类型或对象必须为String。