我主要想问的是,每次添加新项时,使用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,以及何时释放它?我正在跟踪这个例子,,但我仍然不知道如何与函数一起工作?谢谢你,乔纳森
发布于 2019-02-16 20:48:38
我不知道我需要在哪里创建TList,以及为什么我们首先需要创建它,而不是普通的数组。
TList是一个必须通过调用Create来实例化的对象。与堆上分配的任何对象一样,必须在使用之前创建它。
当您不再需要它时,必须通过调用Free来释放它。请注意,TList具有数组以外的其他特征。它有处理排序、比较、插入之类的方法、属性等。
“普通”数组可以是静态数组,也可以是动态数组。
SetLength或通过与另一个数组或值的连接将其分配给堆。我是否需要在事件函数中再次创建TList,以及何时释放它?
在您的示例中,变量data是全局变量。一旦分配了x或y字段,它们就会一直存在直到被销毁。所以,不,你不必再创建它们了。
正如@Remy所述,如果您想在整个单元中使用data变量,则可以在单元的初始化和最后确定部分中对其进行初始化和最后确定。
我主要想问的是,每次添加新项时,使用TList是否比更改动态数组的长度更合适。
就像上面提到的,TList<T>是一个具有排序等方法的对象。如果您不需要这些额外的函数,动态数组就可以了。
如果您正在考虑性能,请首先使用分析器来确定您是否会通过优化代码获得任何东西。在动态数组中逐项添加项可能比使用TList慢。TList将在更大的块中扩展其内部数组,以避免过多的堆重新分配。
https://stackoverflow.com/questions/54725250
复制相似问题