【问题标题】:TStringList vs. TList<string>TStringList 与 TList<string>
【发布时间】:2010-09-21 17:21:50
【问题描述】:

使用标准有什么区别

type 
  sl: TStringList 

与使用通用 TList 相比

type 
  sl: TList<string>

?

据我所知,两者的行为完全相同。

这只是做同样事情的另一种方式吗?

有没有一种情况会比另一种更好?

谢谢!

【问题讨论】:

  • 尝试将 'Hello' + sLineBreak + 'World' 添加到他们两个。行为不一样

标签: delphi generics tstringlist


【解决方案1】:
  • TStringList 是 TStrings 的后代。
  • TStringList 知道如何按字母顺序排序。
  • TStringList 有一个 Objects 属性。
  • TStringList 不会使您的代码与所有以前版本的 Delphi 不兼容。
  • TStringList 可以用作发布的属性。 (一个错误导致泛型类暂时无法发布。)

【讨论】:

  • TStringList 是 TStrings 的后代这一事实是一个主要特性:它可以在使用 TStrings 的 VCL 中使用。所以在你的代码中使用 TStrings 是非常方便的。
  • 您正在回复一个 5 年前的答案,@Bernd。如果您想知道已发布的属性是否可以具有泛型类的类型,我邀请您首先尝试一下,然后发布一个真正的问题来询问它。当您发布您的问题时,您应该首先尝试过,因此请务必报告您的体验,并提及您使用的版本。在 2008 年,我显然不是在谈论比 Delphi 2009更新的任何版本。
  • 这是一个很好的论据!我没有启用我的大脑。当然,除了 2009 年,没有其他版本了,因为在那个版本中引入了泛型,并且当时没有其他版本的 Delphi 发布到标记。但是现在我们已经记录了它;-)
【解决方案2】:

在泛型出现之前,TStringList 在 Delphi 中已经存在了很长时间。因此,它构建了一些通用字符串列表所没有的有用功能。

泛型版本只是创建一个与 TList 相同的新类型,它适用于 String 类型。 (.Add()、.Insert()、.Remove()、.Clear() 等)

TStringList 具有基本的 TList 类型方法和自定义处理字符串的其他方法,例如 .SaveToFile() 和 .LoadFromFile()

如果您想要向后兼容,那么 TStringList 绝对是您的最佳选择。
如果您想要增强处理字符串列表的功能,那么 TStringList 是您的最佳选择。 如果您有一些基本的编码基础知识想要处理任何类型的列表,那么您可能需要远离 TStringList。

【讨论】:

    【解决方案3】:
    • 由于 TStringList 是 TStrings 的后代,它兼容 TMemo 的 Lines 属性、TListbox 和 TComboBox 的 Items 以及其他 VCL 组件。 所以可以使用 cbList.Items := 字符串列表; // 内部调用 TStrings.Assign

    【讨论】:

    • 但你可以做 cbList.Items.AddStrings(ListOfString.toArray) 或类似的事情。 PS。引入 TList 和 TArray 之间有什么不同的真正问题:-D
    【解决方案4】:

    我可能会说如果你想要向后兼容使用 TStringList,如果你想要向前兼容(也许将来可以选择将字符串列表更改为 Int64 列表)然后选择 TList。

    【讨论】:

      【解决方案5】:

      从内存的角度来看,TStringList 内存使用量随着添加到每个项目的 TObject 指针的大小而增加。 TList 内存使用量随着添加到每个项目的指针大小而增加。如果只需要一个字符串数组而不需要搜索、替换、排序或关联操作,那么一个动态数组(字符串数组)应该就足够了。这对TStringList或TList缺乏良好的内存管理,但理论上应该使用更少的内存。

      【讨论】:

        【解决方案6】:

        TStringlist 是一个非常通用的 Delphi 类。我多次使用(并滥用 ;-))它的 Objects 属性。将分隔字符串快速转换为 TMemo 和类似控件(TListBox、TComboBox 等)的控件非常有趣。

        我只是不太喜欢 TList,因为 TStringList 满足了我的需求而不需要处理指针(因为 Tlist 是指针值的列表)。

        编辑:我将 TList(指针列表)与 TList(通用字符串列表)混淆了。对此感到抱歉。我的观点是:TStringList 不仅仅是一个简单的字符串列表。

        【讨论】:

          【解决方案7】:

          对于过去 TStringList 被滥用的大多数目的,TObjectDictionary 更好 - 它更快且不需要排序。

          如果您需要一个 TStrings 对象(通常用于 UI 的东西,因为 VCL 甚至对于 XE5 也不使用泛型)使用 TStringList - 从 TObject 所需的强制转换很烦人,但不是一个很好的选择。

          【讨论】:

            【解决方案8】:

            TStringList 已经用了太久了,而且有很多优点,Rob Kennedy 都提到了。

            将它用作一对字符串和一个对象的唯一真正缺点是必须将对象转换为预期并存储在此列表中的实际类型(读取时),据我所知,Embarcadero 没有提供 Delphi 2009 及更高版本的具有通用版本 TStringList 的 VCL 库。

            为了克服这个限制,我实现了这样的列表供内部使用,近 3 年来它一直在服务于它的目的,所以我决定今天分享它:https://github.com/t00/deltoo#tgenericstringlist

            一个重要的注意事项 - 它将默认属性从字符串更改为对象,因为在大多数情况下,当对象存储在列表中时,它也是它最常访问的属性。

            【讨论】:

              猜你喜欢
              • 2023-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-17
              相关资源
              最近更新 更多