枚举在C#中是否有成员限制?
我想知道枚举结构类型是否对其成员有限制。我有一个非常大的“变量”列表,我需要将它们存储在枚举中或作为类中的常量,但我最终决定将它们存储在类中,然而,我对枚举成员的限制(如果有的话)有点好奇枚举在C#中是否有成员限制?,c#,.net,C#,.net,我想知道枚举结构类型是否对其成员有限制。我有一个非常大的“变量”列表,我需要将它们存储在枚举中或作为类中的常量,但我最终决定将它们存储在类中,然而,我对枚举成员的限制(如果有的话)有点好奇 那么,枚举在.Net上有限制吗?由于PE文件格式的限制,您可能不能超过100000000个值。也许更多,也许更少,但绝对不是问题。是的。具有不同值的成员的数量受基础类型enum的限制-默认情况下,这是Int32,因此您可以获得这么多不同的成员(2^32-我发现很难达到该限制),但您可以像这样显式指定基础类型:
那么,枚举在.Net上有限制吗?由于PE文件格式的限制,您可能不能超过100000000个值。也许更多,也许更少,但绝对不是问题。是的。具有不同值的成员的数量受基础类型
enum
的限制-默认情况下,这是Int32
,因此您可以获得这么多不同的成员(2^32-我发现很难达到该限制),但您可以像这样显式指定基础类型:
enum Foo : byte { /* can have at most 256 members with distinct values */ }
当然,如果所有成员都具有相同的值,则可以拥有任意数量的成员:
enum { A, B = A, C = A, ... }
在这两种情况下,C#编译器中可能有一些实现定义的限制,但我希望它是最小值(range-of-Int32,free memory),而不是硬限制。来自,1.10:
枚举类型的存储格式和
可能值的范围为
由其基础类型决定
虽然我不能100%确定Microsoft C#compiler是否只允许非负枚举值,因此如果基础类型是Int32(默认情况下是),那么我希望大约有2^31个可能的值,但这是一个实现细节,因为没有指定。如果您需要的不止这些,那么可能是做错了什么。理论上,您可以在枚举中使用int64作为基本类型,并获得2^63个可能的条目。其他人在这方面给了你极好的答案 我认为还有第二个隐含的问题是,您是否应该使用enum来表示具有大量项的内容。这实际上在许多方面直接适用于您的项目 最大的考虑因素之一是长期的可维护性。你认为公司会改变你使用的价值观吗?如果是这样,是否需要与以前的列表向后兼容?这会是一个多大的问题?通常,枚举中的成员数越大,在将来某个日期需要修改列表的可能性就越高 枚举在很多方面都很有用。它们干净、快速且易于实施。它们与IntelliSense配合得很好,使下一个程序员的工作更容易,特别是如果名称清晰、简洁,并且如果需要的话,有很好的文档记录 问题是枚举也有缺点。如果需要更改它们,特别是在使用它们的类被持久化到存储中时,它们可能会出现问题 在大多数情况下,枚举作为其基础值而不是友好名称持久化到存储器中
enum InsuranceClass
{
Home, //value = 0 (int32)
Vehicle, //value = 1 (int32)
Life, //value = 2 (int32)
Health //value = 3 (int32)
}
在本例中,值InsuranceClass.Life
将作为数字2保留
如果另一个程序员对系统做了一个小改动,并像这样将Pet添加到枚举中
enum InsuranceClass
{
Home, //value = 0 (int32)
Vehicle, //value = 1 (int32)
Pet, //value = 2 (int32)
Life, //value = 3 (int32)
Health //value = 4 (int32)
}
从存储中出来的所有数据现在都将生命策略显示为Pet策略。这是一个非常容易犯的错误,可能会引入难以追踪的bug
Enum的第二个主要问题是,数据的每次更改都需要重新构建和重新部署程序。这会引起不同程度的疼痛。在web服务器上,这可能不是一个大问题,但如果这是一个在5000个桌面系统上使用的应用程序,那么重新部署小列表更改的成本就完全不同了
<>如果你的列表有可能周期性地改变,你应该考虑一个系统,它以其他形式存储列表,最有可能在代码之外。数据库是专门为此场景设计的,甚至可以使用一个简单的配置文件(而不是首选的解决方案)。对更改进行智能规划可以减少或避免与重建和重新部署软件相关的问题
这不是一个针对可能发生的更改而过早优化系统的建议,而是一个构建代码结构的建议,以便将来可能发生的更改不会产生重大问题。不同的情况需要不同的决定
以下是我使用枚举的粗略经验法则
InsuranceClass.Life
来
确定应该如何使用类中的其他数据,但我会
不使{pseudocode}InsuranceClass.Life=$653.00的基础值
和
在计算中使用值本身。枚举不是常量。做
这造成了混乱李>
希望这能以一种有用的方式扩展答案。我只是好奇你在做什么,需要这么多常数才能问这个问题……当然我不会使用2^32大小的限制,但我需要很多“存储空间”。我们正在开发一个与保险相关的应用程序,因此需要考虑很多变量