我应该总是使用"TList <String>"而不是"Array of String"吗?

san*_*206 6 delphi

我一直在迁移Delphi 7中开发的项目,并且每次以前的开发人员想要使用他们创建的集合时都会查看代码:

ArrayOfString : array of string;
ArrayOfInteger: array of integer;
ArrayOfStringArrays : array of ArrayOfString;
Run Code Online (Sandbox Code Playgroud)

这种代码在很多地方重复,并且每次都为它们中的每一个重复"SetLength",我想知道是否将所有这些Array of Something改为TList<Something>现在我们在Delphi XE4中.

这样做有什么好处,资源,速度或类似的东西来支持我做出这个决定?

PS:我来自JAVA和Delphi给我感到黑暗和充满恐惧

Dav*_*nan 10

将动态数组视为比TStringList或更低级别的构造TList<T>.

动态数组通过指针提供对元素的直接访问.该语言隐藏了指针,但这基本上都是动态数组.但是你负责任何重新分配,如果你想插入或删除项目,那么你必须编写代码,并处理细节.

更高级别的集合类,TStringList并且TList<T>是建立在动态数组的顶部.这是内部如何存储内容.但是集合类为你包装了这个.作为方法提供了诸如插入和删除等更高级别的操作.实质上,这些集合类比原始动态数组提供了更多的便利.

为了说明,请考虑插入项目的行为.对于动态数组,您可以这样做:

  1. 调整阵列大小.
  2. 将插入点之后的项目从位置i移动到i + 1.
  3. 分配插入的项目.

如果您不止一次需要编写此代码,那么,您做错了.

对于您写的高级集合:

List.Insert(Index, Value);
Run Code Online (Sandbox Code Playgroud)

让班级来处理细节.

请注意,由于历史原因,并且因为字符串特别重要,开发人员倾向于使用定制的专用TStringList类而不是TList<string>.专用类再次提供了功能,TList<string>因为它专注于字符串,并且可以提供定制到字符串的功能.同样,专用课程提供了便利.

动态阵列派上用场的一个地方就是当你不想招致终身管理的样板时.因此,对于没有针对类的ARC的桌面编译器,您需要显式地销毁TList<T>实例.但动态阵列的生命周期由ARC管理.如果您一次性合成数组,然后不调整它们的大小,那么生命周期管理问题可以使数组更方便使用.

根据经验,喜欢高级集合类.它们应该是您的默认选择.有时动态数组是正确的选择,但这往往适用于更专业的场景.


Mas*_*ler 6

首先,在较新版本的Delphi中,有一种TArray<T>类型可用于替换所有旧的array of whatever声明.使用它可以解决语言中的一些长期陷阱,从经典的Pascal遗留下来,并帮助你不要遇到混乱的错误.

话虽如此,TStringList不是一个字符串数组; 它是一个容器对象,包含一个字符串列表.它有几种专门的字符串列表处理方法,使它非常通用:它基本上可以用作字符串列表,一组字符串(通过.Sorted属性),字符串/对象映射(通过.Objects属性)和字符串/ string map(通过.Names.Values属性.)

如果你发现你正在调用SetLength一个数组,特别是如果它类似于以下内容,你肯定应该将它转换为列表类:

for i := 0 to Count - 1 do
begin
   SetLength(myArray, length(myArray) + 1);
   myArray[high(myArray)] := values[i];
end;
Run Code Online (Sandbox Code Playgroud)

使用通用TList<T>或a TStringList,这变为:

for i := 0 to Count - 1 do
begin
   myList.Add(values[i]);
end;
Run Code Online (Sandbox Code Playgroud)

这既易于阅读又具有更高的性能(特别是具有较大的Count值),因为列表类能够在内部跟踪它们的大小并保持内存重新分配.所以列表类在大多数情况下都是双赢的.在某些情况下,您更喜欢动态数组,但它们很少见.

但有一点需要注意:如果您来自Java背景,请记住动态数组是编译器管理的类型,但列表类是需要在代码中释放的对象.

  • @DavidHeffernan什么是反恐精英条款? (3认同)
  • @PageNotFound计算机科学 (3认同)
  • @Mason在CS术语中,delphi所指的列表实际上是一个数组.同源类型项的集合,由连续的整数范围索引.在CS术语中,列表表示一种或另一种形式的链表.Emba选择的术语充其量是不幸的.Delphi列表具有数组的性能特征. (2认同)