在声明枚举时,是否应该将类型强制为256个实体以下的字节?

如果你的应用程序中有一个枚举而你只有几个项目,你应该强制基础类型是最小的类型吗?

enum smaller : byte { one, two, three }; 

不。不要过早地优化, 除非你用剖析器certificate它实际上是一个问题。

与最佳做法有关:

如果没有特殊原因使枚举成为类型字节,则应将其保留为默认值。

无论何时在switch语句中使用枚举,都应该为无效的枚举值设置“default”子句。 因此,如果要检查256-NumRealEnumValues或2 ^ 32-NumRealEnumValues,则无关紧要。 两者都有一个处理所有无效情况的默认子句。

显式设置枚举类型的一个原因是,如果您希望枚举与程序中的其他类型相对应,则需要在它们之间显式转换。

将类型更改为最小适合也无助于解决版本问题。 除非您确实填写了枚举的最大大小。 通过版本化问题,我的意思是当你使用枚举编译dll时,然后你添加一个新的枚举值,一些代码可能执行,而不是在switch语句的“default”子句中。

与效率有关:

在效率方面没有任何好处使它成为一个字节。

int的使用效率更高,因为x86上的cpu具有32位寄存器。 复制到寄存器一次是32位。

当您使用较小的类型时,必须将寄存器的一部分归零并复制到寄存器的低阶位的其余部分。

执行此操作的唯一原因是,如果您使用定义的协议存储或传输此值,该协议要求字段具有该大小。

会得到什么? 您将节省大量3个字节的内存,但代价是执行速度稍慢,代码不太直观或可读。 (读到这个,我不得不怀疑pyou是否真的有理由让它成为一个字节,这可能是什么原因。大概是你出于某种原因而不顾一切地使用非默认类型)。

如果您计划存储数百万这些东西,那么每个节省几个字节可能会有所回报。 否则,没有。

这与通常不使用byte或short而不是int的原因相同。

如果要将模型与枚举映射到另一个模型,或者将其序列化,或者将枚举反映到数据库列 – 那么我建议您明确指定类型。


场景:数据库中有一个列: status_id ,类型为tinyint 。 你的代码中有枚举: enum Status { Well = 1, Bad = 2 } 。 你在某个实体中使用这个枚举。 假设您使用entity framework核心2.0。 如果您尝试从数据库读取/写入此实体,您将收到错误“无法转换对象”,除非您明确指定byte类型。

您不应该为枚举指定某个整数类型,而是让.NET环境找出枚举的最佳“大小”。 正如JaredPar所说, 如果你改变数据类型,你一定要检查它是否真的有帮助。

问题是32位整数在x86处理器上是“自然的”,因为它们可以很容易地以最佳方式对齐。