这是变量数组和动态数组的区别



使用Variant数组(如此处所示)有哪些区别

var
  VarArray : Variant;
begin
  VarArray := VarArrayCreate([0, 1], varInteger);
  VarArray[0] := 123;
  <...>
end;

而不是普通的动态数组?

var
  DynArray : array of Integer;
begin
  SetLength(DynArray, 1);
  DynArray[0] := 123;
  <...>
end;

变体是一种从编译器和运行时获得特殊处理的类型。在底层,它们是TVarRec类型的记录。它们可以在内部包含许多不同类型,甚至可以用于在其中一些类型之间进行转换。但是它们也可以包含值的数组,甚至是其他变量的数组,无论是单一的还是多维的。那是变体数组。System.Variants单元包含定义和处理这些数组的函数。

关于Delphi基础的更多信息。

变体通常由Windows COM使用。请注意,它们可能相当慢,特别是具有多个维度的Variant数组。它们可以包含的类型数量是有限的。

动态数组是内置类型。它们是普通的数组,可以包含任何类型的元素,内置的或用户定义的。与普通(静态)数组的不同之处在于,它们可以动态地实例化、放大或缩小(例如使用SetLength),它们的变量是指向实际数组(在堆上分配)的指针。它们的生存期由运行时管理。

动态数组是合适的内置类型,比变体(和变体数组)通用得多。

Delphi Basics也有更多的信息。

更新

正如Remy Lebeau所评论的那样,我应该提到Variant数组(以及OleVariant数组)是基于COM的SAFEARRAY结构的,因此只能使用COM/OLE兼容的数据类型创建,即使Delphi的Variant可以保存非COM/OLE类型。

相关内容

  • 没有找到相关文章

最新更新