考虑这种类型的枚举,您可以使用按位比较基本上将多个布尔值组合到一个数据字段中:
[Flags] public enum Options { None = 0, Option1 = 1, Option2 = 2, Option3 = 4, Option4 = 8 }
我已阅读MSDN文档,网址为https://msdn.microsoft.com/en-us/library/ms229062(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -1并完成了一些谷歌搜索,但我仍然有一些架构问题.
似乎最多[EDIT:8]选项(加上"none"),您可以将任何标志组合放入单个存储字节中.这实际上是它在运行时是如何处理的,还是只是陷入了Int32而浪费了剩余的空间?添加第九个选项是否存在效率劣势?如果是这样,在达到下一个效率劣势之前,您还可以添加多少选项?关于其中一个应该有多大,是否有经验法则?我正在考虑将这个用于需要至少6个标志的应用程序,但可以想象它会增加到8-12个标志(但我也对理论限制感兴趣.)
提前致谢!
默认情况下,任何枚举都由a支持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个选项.
至于设计最佳实践,只需阅读Microsoft在Enums上的最佳实践页面