Delphi 我应该使用“a”吗;TList<;字符串>&引用;而不是",;字符串数组";总是吗?
我一直在迁移一个用Delphi 7开发的项目,每次以前的开发人员想要使用他们创建的集合时,我都会查看代码,如下所示:Delphi 我应该使用“a”吗;TList<;字符串>&引用;而不是",;字符串数组";总是吗?,delphi,Delphi,我一直在迁移一个用Delphi 7开发的项目,每次以前的开发人员想要使用他们创建的集合时,我都会查看代码,如下所示: ArrayOfString : array of string; ArrayOfInteger: array of integer; ArrayOfStringArrays : array of ArrayOfString; 这类代码在很多地方重复,而且每个地方的“SetLength”也重复了好几次,我想知道,既然我们在Delphi XE4中,是否将所有这些数组更改为TList
ArrayOfString : array of string;
ArrayOfInteger: array of integer;
ArrayOfStringArrays : array of ArrayOfString;
这类代码在很多地方重复,而且每个地方的“SetLength”也重复了好几次,我想知道,既然我们在Delphi XE4中,是否将所有这些数组
更改为TList
这样做有什么优势,资源,速度或类似的东西来支持我的决定吗
PS:我来自JAVA和Delphi,对我来说感觉黑暗且充满恐惧认为动态数组是比
TStringList
或TList
更低级别的构造
动态数组通过指针提供对元素的直接访问。该语言对您隐藏指针,但这基本上就是动态数组的全部内容。但是您负责任何重新分配,如果您希望插入或删除项目,那么您必须编写代码并处理细节
更高级别的集合类,TStringList
和TList
构建在动态数组之上。这就是内容的内部存储方式。但是集合类会为您总结这些。更高级别的操作(如插入和删除)以及更多操作都作为方法提供。本质上,这些集合类比原始的动态数组提供了更多的便利
以说明,考虑插入项目的行为。对于动态阵列,您可以执行以下操作:
List.Insert(Index, Value);
让全班同学注意细节
请注意,出于历史原因,并且由于字符串特别重要,开发人员倾向于使用定制的专用TStringList
类,而不是TList
。同样,这个专用类提供了高于TList
的功能,因为它专门研究字符串,并且可以提供定制到字符串的功能。同样,专用类提供了便利
当您不想使用生命周期管理的样板时,动态阵列就派上了用场。因此,对于没有ARC for类的桌面编译器,需要显式销毁TList
实例。但动态阵列的生存期由ARC管理。如果一次合成阵列,然后不调整它们的大小,那么生命周期管理问题会使阵列使用更加方便
根据经验,我们更喜欢高级集合类。它们应该是您的默认选择。有时,动态阵列是正确的选择,但这往往适用于更专业的场景 首先,在较新版本的Delphi中,有一个
TArray
类型,可以用来替换所有那些旧的数组中的声明。使用它可以解决经典Pascal语言遗留下来的一些长期存在的问题,并帮助您避免遇到令人困惑的bug
话虽如此,TStringList不是一个字符串数组;它是一个容器对象,包含字符串列表。它有几种专门的字符串列表处理方法,使其用途非常广泛:基本上可以用作字符串列表、一组字符串(通过.Sorted
属性)、字符串/对象映射(通过.Objects
属性)和字符串/字符串映射(通过.Names
和.Values
属性。)
如果您发现您经常在数组上调用SetLength
,特别是如果它类似于以下内容,那么您肯定应该将其转换为列表类:
for i := 0 to Count - 1 do
begin
SetLength(myArray, length(myArray) + 1);
myArray[high(myArray)] := values[i];
end;
使用通用的t列表
或t列表
,这将成为:
for i := 0 to Count - 1 do
begin
myList.Add(values[i]);
end;
这既简单易读,又显著提高了性能(特别是对于较大的计数值)因为列表类能够在内部跟踪它们的大小,并减少内存的重新分配。所以列表类在大多数情况下都是双赢的。在某些情况下,您可能更喜欢动态数组,但它们有点罕见
不过,有一件事需要注意:如果您有Java背景,请记住动态数组是编译器管理的类型,但列表类是需要在代码中释放的对象。除非您对字符串和数组有特殊需要,否则我强烈建议使用TStringList。就我个人而言,我根本不会使用TListtringList提供了我所需要的一切,只有少数情况下我需要使用字符串数组
可以通过myStringList.Items[i]或者仅仅通过myStringList[i]像数组一样访问TStringList
您不需要不断更改长度或计数,只需myStringList.Add(aString)和myStringList.count(不要忘记循环的-1)
此外,它还具有添加、删除、重新排序、排序等所有列表操作所需的例程
它也可以作为参数传递,而不需要像数组类型那样的其他声明
希望这能有所帮助。“…而且性能显著提高”那么列表的处理速度确实比数组快吗?@sandiego206:我特别想说的是,将所有这些项目添加到列表中要比反复调用SetLength
性能好得多。对于处理问题,这实际上取决于你所说的“处理”到底是什么意思@Mason在CS术语中,delphi所指的列表实际上是一个数组。同质类型项的集合,由一个连续的整数范围索引。在CS术语中,列表表示一种或另一种形式的链表