Delphi 枚举类型:项目数量限制?

Delphi 枚举类型:项目数量限制?,delphi,Delphi,在Delphi中,枚举类型中可以包含的项目数量是否有限制?我需要创建一个枚举类型,该类型可能有几百个项目,并希望确保在255个项目上没有限制 type TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred); 试试看?只需几分钟就可以编写一个循环,该循环将根据需要构建您的类型语句。使用messagebox(可以用ctrl+c将其复制到剪贴板)输出,粘贴回Delphi,就可以全部设置好了。我在一本德文Delphi书籍中最多找到65535

在Delphi中,枚举类型中可以包含的项目数量是否有限制?我需要创建一个枚举类型,该类型可能有几百个项目,并希望确保在255个项目上没有限制

type 
  TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);

试试看?只需几分钟就可以编写一个循环,该循环将根据需要构建您的类型语句。使用messagebox(可以用ctrl+c将其复制到剪贴板)输出,粘贴回Delphi,就可以全部设置好了。

我在一本德文Delphi书籍中最多找到65535项

在对文档进行了一些挖掘之后,我找到了相应的部分:

枚举类型存储为 无符号字节,如果枚举具有 不超过256个值和类型 在
{$Z1}
状态下声明( 默认值)。如果枚举类型具有 超过256个值,或者如果 是在
{$Z2}
状态下声明的,它是 存储为无符号字。如果 枚举类型在
{$Z4}
状态,它存储为 无符号双字


因此,事实上,可能最多有4294967295(
$FFFFFFFF
)个项目。

我认为理论限制为2^32个项目;但在实践中,RTTI生成通常是有限的,因为RTTI不能超过65535字节来存储所有内容,包括枚举元素的名称;这些名称存储在UTF-8中,所以还不错

另一方面,元素具有显式值的枚举没有完整的RTTI,因此可以通过这种方式规避限制。下面是一个程序,它创建了一个包含500001个枚举元素的源文件,该文件本身编译:

var
  i: Integer;
begin
  Writeln('type');
  Writeln('  E = (');
  for i := 1 to 500000 do
    Writeln('  x_', i, ' = ', i, ',');
  Writeln('x_last);');
  Writeln('begin');
  Writeln('end.');
end.

使用dcc32编译此程序的输出需要一些时间,因为Delphi编译器使用一个只有32个bucket的哈希表来检查枚举标识符的重复项,使用一个只有256个bucket的哈希表来检查文件级范围,这(在没有
{$SCOPEDENUMS ON}
的情况下)是添加枚举标识符的位置。

Delphi中的Yes枚举可以包含256个以上的项。它们不会有问题,但如果要使用集合类型,则应注意集合最多可以有256个元素。

请记住:枚举几乎可以是无限的,但如果创建一组EnumerationType,集合中的元素不能超过256个。由于枚举经常与集合结合使用,因此将自己限制在集合类型的限制内更为实际。同意。“我从来没有接近过100的数值。@Workshop Alex:如果要在已发布属性中使用该集合,甚至需要将集合中的项目限制为32个。”。只有适合32位值的集合才能使用RTTI进行序列化/反序列化。@Ritsaerd,如果您愿意创建自己的序列化代码(有时必须为特殊的已发布属性执行此操作),则不完全正确。就我个人而言,我不经常使用具有已发布属性的类。发布的属性主要用于在设计时设置、从DFM初始化的组件。我的大多数类都是从其他来源初始化的。