31

使用标准有什么区别

type 
  sl: TStringList 

与使用通用 TList 相比

type 
  sl: TList<string>

?

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

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

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

谢谢!

4

8 回答 8

42
  • TStringList 是 TStrings 的后代。
  • TStringList 知道如何按字母顺序对自己进行排序。
  • TStringList 有一个 Objects 属性。
  • TStringList 不会使您的代码与所有先前版本的 Delphi 不兼容。
  • TStringList 可以用作发布的属性。(一个错误阻止了泛型类的发布,目前。)
于 2008-11-10T22:58:02.170 回答
12

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

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

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

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

于 2008-11-11T01:54:10.303 回答
2
  • 由于 TStringList 是 TStrings 的后代,因此它与 TMemo 的 Lines 属性、TListbox 和 TComboBox 的 Items 以及其他 VCL 组件兼容。所以可以使用 cbList.Items := StringList; // 内部调用 TStrings.Assign
于 2008-11-11T01:11:05.617 回答
2

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

于 2008-11-11T08:34:03.693 回答
2

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

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

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

于 2008-11-12T17:15:50.940 回答
2

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

于 2011-10-17T13:40:54.013 回答
1

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

如果您需要一个 TStrings 对象(通常用于 UI 的东西,因为即使对于 XE5,VCL 也不使用泛型太多)使用 TStringList - TObject 所需的转换很烦人,但不是一个炫耀。

于 2013-09-27T11:16:53.560 回答
0

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

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

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

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

于 2013-07-25T11:00:42.940 回答