该声明不会创建 100 个对象,它只会为您提供一个包含 100 个对象引用的数组,这些引用没有任何用处。
创建对象是一个两步过程。第一步是分配内存(您的代码也没有),第二步是调用构造函数(Create 方法)来初始化该内存,创建其他对象等。
分配部分可以在没有循环的情况下完成,但是需要调用构造函数来初始化每个实例。
许多 VCL 类没有额外的构造函数。他们只有一个什么都不做的空构造函数。在这种情况下,没有必要调用它。
例如,要获取字符串列表数组,您可以使用以下代码,根据此示例进行调整:
type
TStringListArray = array of TStringList;v
var
Instances: array of Byte;
function GetStringLists(Number: Integer): TStringListArray;
var
i: Integer;
begin
// Allocate instance memory for all of them
SetLength(Instances, Number * TStringList.InstanceSize);
// Zero the memory.
FillChar(Instances[0], Length(Instances), 0);
// Allocate array for object references.
SetLength(Result, Number);
for i := 0 to High(Result) do
begin
// Store object reference.
Result[i] := @Instances[i * TStringList.InstanceSize];
// Set the right class.
PPointer(Result[i])^ := TStringList;
// Call the constructor.
Result[i].Create;
end;
end;
并获得一个包含 100 个字符串列表的数组:
var
x: TStringListArray;
begin
x := GetStringLists(100);
因此,虽然此过程可以为您节省可忽略的时间,并且理论上可能更节省内存(更少碎片),但您仍然需要循环。没有捷径。