C# 枚举中有意义的最大标志数是多少?

C# 枚举中有意义的最大标志数是多少?,c#,C#,考虑到这种类型的枚举,您可以使用位比较将多个布尔值基本合并到单个数据字段中: [Flags] public enum Options { None = 0, Option1 = 1, Option2 = 2, Option3 = 4, Option4 = 8 } 我已经在上阅读了MSDN文档并进行了一些谷歌搜索,但我仍然有一些架构问题 看起来,通过最多[编辑:八个]选项(加上“无”),您可以将任何标志组合放入单个字节的存储中。这实际上是在运行时处

考虑到这种类型的枚举,您可以使用位比较将多个布尔值基本合并到单个数据字段中:

[Flags]
public enum Options 
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}
我已经在上阅读了MSDN文档并进行了一些谷歌搜索,但我仍然有一些架构问题

看起来,通过最多[编辑:八个]选项(加上“无”),您可以将任何标志组合放入单个字节的存储中。这实际上是在运行时处理它的方式,还是只是将它卡在Int32中而浪费了剩余的空间?添加第九个选项是否存在效率劣势?如果是,在遇到下一个效率劣势之前,您还可以添加多少个选项?关于其中一个应该有多大,有没有经验法则?我正在考虑将此应用程序用于至少需要6个标志的应用程序,但可以想象,它可能会增加到包括8-12个标志(但我对理论限制也感兴趣)


提前谢谢

您可以指定所需任何枚举的基础类型。
如果不这样做,它将始终是
Int32


另外,
byte
最多可以容纳8个标志。

默认情况下,任何枚举都由
int
支持,这意味着其中包含32位。它最多可以容纳32个不同的标志,因为每个标志只是在
int
中设置了一位

当您的标志少于32个时,它仍然会占用单个
int
的空间,即4个字节。您可以从列表
byte
sbyte
short
ushort
int
uint
long
ulong
中选择其他类型作为基础类型

因此,如果只有4个选项,则可以将枚举声明为

[Flags]
public enum Options : byte
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}
然后它只会占用一个字节的内存,在用完位之前,您可以添加多达8个选项


至于设计最佳实践,只需阅读

多一点太多,少一点太少。不要在标志枚举中使用
0
值。它在使用该枚举时可能会导致奇怪的问题
None
不应该是该枚举的成员。过度担心数据打包有点像文件分配。在20世纪90年代初,一些人曾经担心,一个包含20个字符的文本文件在我们庞大的40 MB硬盘上仍然会占据整个MS-DOS 512字节集群,并抱怨空间丢失。他们最终会求助于压缩所有东西,这只会造成另一个问题,即在需要查看该文件时进行计算。现在,如果硬盘驱动器只包含小文本文件,那么当然,但出于同样的原因,.NET程序很少只是
标志enum
s;这是100%违反设计准则。相反,请阅读实际的设计指南,您的每个进程至少有20亿字节的地址空间,磁盘空间以每万亿字节几美元的速度运行,您担心的是一个字节对四个字节。担心更重要的事情。一个字节有8个标志(9个包括无)。@Phil1970:Oops;修正了。@MickyD-Scott Chamberlain的回答基本上与此相同,但您需要额外的信息。我很感激这两个答案——任何一个基本上都告诉了我需要知道的事情@是的,我错过了。:)谢谢我确实阅读了最佳实践页面——这是我引用的链接——但它甚至没有显示语法,更不用说更深入的考虑了。不过,这是有道理的。@ElementalPete有关语法和更深入的注意事项,请参阅的页面,这是我获得允许使用的基础类型列表的地方。如果枚举类型上的值多于基础类型中的位,则编译器不会发出警告或出错。这些值只是环绕并重复。当两个或多个不同名称的枚举值具有相同的数值,并且突然匹配
hasvag
=
操作时,这会导致难以发现的奇怪效果和错误。