使用全局TList <real>

时间:2019-02-16 16:34:54

标签: delphi generics

我主要想问一下,每次添加新项时,使用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,,但仍然感到困惑。 谢谢, 乔纳森

1 个答案:

答案 0 :(得分:2)

  

与常规数组不同,我对需要在哪里创建TList以及为什么首先需要创建TList感到困惑。

TList是必须通过调用Create实例化的对象。 像在堆上分配的任何对象一样,必须在使用之前创建它。

如果您不再需要它,则必须通过调用Free来释放它。请注意,TList具有数组以外的其他特征。它具有方法,属性等,以处理排序,比较,插入等操作。


“普通”数组可以是静态数组,也可以是动态数组。

  • dynamic array是一种托管类型,其中生存期是通过使用引用计数自动处理的。通过调用SetLength或与另一个数组或值的串联将其分配给堆。
  • static array在范围内时会自动堆栈分配,因此不需要显式创建。

  

我是否需要在事件函数中再次创建TList,何时释放它?

在您的示例中,变量data是全局变量。分配了xy字段后,它们将一直有效直到被销毁。因此,不,您不必再次创建它们。

正如@Remy所说,如果要在整个单元中使用data变量,则可以在单元的初始化和终止部分中对其进行初始化和终止。


  

我主要想问一下,每次添加新项时,使用TList是否比更改动态数组的长度更合适。

像上面提到的,TList<T>是具有排序等方法的对象。 如果您不需要这些额外的功能,则可以使用动态数组。

如果您在考虑性能,请首先使用探查器来查找您是否实际上将通过优化代码获得任何收益。在动态数组上一一添加项可能比使用TList慢。 TList将以更大的块增长其内部数组,以避免过多的堆重新分配。