我主要想问一下,每次添加新项时,使用TList是否比更改动态数组的长度更合适。像这样:
SetLength(DynamicArray, Length(DynamicArray)+1);
DynamicArray[length(DynamicArray)] := NewElement;
假设它更合适。.我想知道如果我想创建一个全局的动态数组以供单元中的所有函数访问,这样的事情是否可行?
type
Tdata = Record
y: TList<real>;
x: TList<integer>;
End;
var
data: Tdata;
procedure TForm1.FormCreate(Sender: TObject);
begin
data.y := TList<real>.Create;
data.y.add(1.2);
data.y.add(2.3);
end;
procedure TForm1.ButtonClick(Sender: TObject); // Some button click event
begin
Memo1.lines.add(data.y.count); // Should output 2
end;
与普通数组不同,我对于需要在哪里创建TList以及为什么首先需要创建TList感到困惑。我是否需要在事件函数中再次创建TList,何时释放它?我正在关注this example,,但仍然感到困惑。 谢谢, 乔纳森
答案 0 :(得分:2)
与常规数组不同,我对需要在哪里创建TList以及为什么首先需要创建TList感到困惑。
TList是必须通过调用Create
实例化的对象。
像在堆上分配的任何对象一样,必须在使用之前创建它。
如果您不再需要它,则必须通过调用Free
来释放它。请注意,TList
具有数组以外的其他特征。它具有方法,属性等,以处理排序,比较,插入等操作。
“普通”数组可以是静态数组,也可以是动态数组。
SetLength
或与另一个数组或值的串联将其分配给堆。我是否需要在事件函数中再次创建TList,何时释放它?
在您的示例中,变量data
是全局变量。分配了x
或y
字段后,它们将一直有效直到被销毁。因此,不,您不必再次创建它们。
正如@Remy所说,如果要在整个单元中使用data
变量,则可以在单元的初始化和终止部分中对其进行初始化和终止。
我主要想问一下,每次添加新项时,使用TList是否比更改动态数组的长度更合适。
像上面提到的,TList<T>
是具有排序等方法的对象。
如果您不需要这些额外的功能,则可以使用动态数组。
如果您在考虑性能,请首先使用探查器来查找您是否实际上将通过优化代码获得任何收益。在动态数组上一一添加项可能比使用TList慢。 TList将以更大的块增长其内部数组,以避免过多的堆重新分配。