变体数组和动态数组之间有哪些区别?
Which are differences between Variant arrays and dynamic arrays?
使用 Variant
数组有哪些区别(如图 here)
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;
Variants 是一种从编译器和运行时得到特殊处理的类型。在幕后,它们是 TVarRec 类型的记录。它们内部可以包含许多不同种类的类型,甚至可以用来在其中一些类型之间进行转换。但它们也可以包含值数组,甚至是其他变体的数组,一维和多维。那是变体数组。 System.Variants
单元包含定义和处理此类数组的函数。
更多信息on the Delphi Basics site。
变体通常由 Windows COM 使用。请注意,它们可能非常慢,尤其是具有多个维度的 Variant 数组。它们可以包含的类型数量是有限的。
动态数组是内置类型。它们是普通数组,可以包含任何可以想到的类型、内置或用户定义的元素。与普通(静态)数组的区别在于它们可以动态实例化、放大或缩小(例如使用 SetLength),并且它们的变量是指向实际数组(分配在堆上)的指针。它们的生命周期由运行时管理。
动态数组是适当的内置类型,比变体(和变体数组)更通用。
Delphi 基础知识也有 more info。
更新
正如 Remy Lebeau 评论的那样,我应该提到 Variant
数组(以及 OleVariant
数组)基于 COM 的 SAFEARRAY
结构,因此只能使用COM/OLE-compatible 数据类型,即使 Delphi 的 Variant
可以容纳 non-COM/OLE 类型。
使用 Variant
数组有哪些区别(如图 here)
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;
Variants 是一种从编译器和运行时得到特殊处理的类型。在幕后,它们是 TVarRec 类型的记录。它们内部可以包含许多不同种类的类型,甚至可以用来在其中一些类型之间进行转换。但它们也可以包含值数组,甚至是其他变体的数组,一维和多维。那是变体数组。 System.Variants
单元包含定义和处理此类数组的函数。
更多信息on the Delphi Basics site。
变体通常由 Windows COM 使用。请注意,它们可能非常慢,尤其是具有多个维度的 Variant 数组。它们可以包含的类型数量是有限的。
动态数组是内置类型。它们是普通数组,可以包含任何可以想到的类型、内置或用户定义的元素。与普通(静态)数组的区别在于它们可以动态实例化、放大或缩小(例如使用 SetLength),并且它们的变量是指向实际数组(分配在堆上)的指针。它们的生命周期由运行时管理。
动态数组是适当的内置类型,比变体(和变体数组)更通用。
Delphi 基础知识也有 more info。
更新
正如 Remy Lebeau 评论的那样,我应该提到 Variant
数组(以及 OleVariant
数组)基于 COM 的 SAFEARRAY
结构,因此只能使用COM/OLE-compatible 数据类型,即使 Delphi 的 Variant
可以容纳 non-COM/OLE 类型。