Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
枚举在C#中是否有成员限制?_C#_.net - Fatal编程技术网

枚举在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的基础值
    和 在计算中使用值本身。枚举不是常量。做 这造成了混乱
  • 当枚举列表不太可能更改时,请使用枚举。枚举是伟大的 对于基本概念而言,但对于不断变化的想法而言,效果不佳。 创建枚举时,这是与future的约定 您希望避免中断的程序员
  • 如果您必须更改枚举,那么有一条规则,每个人都要遵守该规则 你把它加到末端,而不是中间。另一种选择是你 为每个枚举定义特定值,并且永远不要更改这些值。这个 关键是你不太可能知道别人是如何使用你的 枚举基础值并更改它们可能会给任何人带来痛苦 否则,请使用您的代码。这是一个更重要的数量级 对于任何保存数据的系统
  • #2和#3的推论是永远不要删除枚举的成员。 对于在他人使用的代码库中执行此操作的程序员来说,有一些特定的地狱圈

  • 希望这能以一种有用的方式扩展答案。

    我只是好奇你在做什么,需要这么多常数才能问这个问题……当然我不会使用2^32大小的限制,但我需要很多“存储空间”。我们正在开发一个与保险相关的应用程序,因此需要考虑很多变量