Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我应该使用“a”吗;TList<;字符串>&引用;而不是",;字符串数组";总是吗?_Delphi - Fatal编程技术网

Delphi 我应该使用“a”吗;TList<;字符串>&引用;而不是",;字符串数组";总是吗?

Delphi 我应该使用“a”吗;TList<;字符串>&引用;而不是",;字符串数组";总是吗?,delphi,Delphi,我一直在迁移一个用Delphi 7开发的项目,每次以前的开发人员想要使用他们创建的集合时,我都会查看代码,如下所示: ArrayOfString : array of string; ArrayOfInteger: array of integer; ArrayOfStringArrays : array of ArrayOfString; 这类代码在很多地方重复,而且每个地方的“SetLength”也重复了好几次,我想知道,既然我们在Delphi XE4中,是否将所有这些数组更改为TList

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

ArrayOfString : array of string;
ArrayOfInteger: array of integer;
ArrayOfStringArrays : array of ArrayOfString;
这类代码在很多地方重复,而且每个地方的“SetLength”也重复了好几次,我想知道,既然我们在Delphi XE4中,是否将所有这些
数组
更改为
TList

这样做有什么优势,资源,速度或类似的东西来支持我的决定吗


PS:我来自JAVA和Delphi,对我来说感觉黑暗且充满恐惧

认为动态数组是比
TStringList
TList
更低级别的构造

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

更高级别的集合类,
TStringList
TList
构建在动态数组之上。这就是内容的内部存储方式。但是集合类会为您总结这些。更高级别的操作(如插入和删除)以及更多操作都作为方法提供。本质上,这些集合类比原始的动态数组提供了更多的便利

以说明,考虑插入项目的行为。对于动态阵列,您可以执行以下操作:

  • 调整数组大小
  • 将插入点之后的项目从位置i移动到i+1
  • 分配插入的项目 如果您需要多次编写此代码,那么您就错了

    对于您编写的高级集合:

    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术语中,列表表示一种或另一种形式的链表