Variant数组和动态数组之间有哪些区别?

Fab*_*zio 2 arrays delphi variant

这是使用一个变体阵列(像示出之间的差异在这里),而不是一个通用动态数组?

Rud*_*uis 10

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

有关Delphi Basics站点的更多信息.

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

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

动态数组是适当的内置类型,比Variants(和Variant数组)更通用.

Delphi Basics还有更多关于它们的信息.

更新

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

  • `Variant`是一种内置类型.`OleVariant`是COM变体类型.当首次添加`Variant`时,它是COM变体,但后来变成了内置类型,因此它不再依赖于COM,并添加了'OleVariant`以与现有和新的COM代码兼容.`Variant`和`OleVariant`是相似的,但它们确实有功能差异. (2认同)
  • `Variant`可以保存非OLE数据类型,如`(Ansi | Unicode)字符串`,`TObject`,`TClass`,甚至是用户定义的类型,因此与COM没有100%兼容(可能有损)数据转换为OLE等效项.另一方面,'OleVariant`与COM完全兼容,因为它基于COM自己的`VARIANT`结构,并且所有Delphi的本机COM互操作都使用`OleVariant`来表示`VARIANT`值. (2认同)