TStringList 对比TList<字符串>
-
07-07-2019 - |
题
使用标准有什么区别
type
sl: TStringList
与使用通用 TList 相比
type
sl: TList<string>
?
据我所知,两者的行为完全相同。
这只是做同样事情的另一种方式吗?
是否存在一种情况会比另一种更好的情况?
谢谢!
解决方案
- TStringList 是 TStrings 的后代。
- TStringList 知道如何按字母顺序对自身进行排序。
- TStringList 有一个 Objects 属性。
- TStringList 不会使您的代码与所有以前版本的 Delphi 不兼容。
- TStringList 可以用作已发布的属性。(目前,一个错误阻止泛型类的发布。)
其他提示
在仿制药出现之前,TStringList已经在Delphi中存在了很长时间。因此,它构建了一些有用的功能,这些功能是通用的字符串列表所不具备的。
泛型版本只是创建一个与TList相同的新类型,它适用于String类型。 (.Add(),. Insert(),. Remove(),. Clear()等。)
TStringList具有基本的TList类型方法和其他自定义处理字符串的方法,例如.SaveToFile()和.LoadFromFile()
如果你想要向后兼容,那么TStringList绝对是你要走的路 如果您想要使用增强功能来处理字符串列表,那么TStringList就是您的选择。 如果你有一些基本的编码基础,你想要使用任何类型的列表,那么你可能需要远离TStringList。
- 由于 TStringList 是 TStrings 的后代,因此它与 TMemo 的 Lines 属性、TListbox 和 TComboBox 的项目以及其他 VCL 组件兼容。因此可以使用cblist.items:= stringList;// 内部调用 TStrings.Assign
我可能会说如果你想要向后兼容性使用TStringList,如果你想要向前兼容性(可能是将该字符串列表更改为将来的Int64列表的选项),那么请选择TList。
从内存的角度来看,TStringList的内存使用量会随着添加到每个项目的TObject指针的大小而增加。 TList内存使用量随着添加到每个项目的指针大小而增加。如果只需要一个字符串数组而不进行搜索,替换,排序或关联操作,那么动态数组(字符串数组)就足够了。这缺乏对TStringList或TList的良好内存管理,但理论上应该使用更少的内存。
TStringlist是一个非常通用的Delphi类。我多次使用(和滥用;-))它的Objects属性。将分隔的字符串快速转换为类似TMemo的控件和类似的控件(TListBox,TComboBox,只列出几个)非常有趣。
<击> 我只是不喜欢TList,因为TStringList满足了我的需求,而不需要处理指针(因为Tlist是一个Pointer值列表)。
编辑:我把TList(指针列表)与TList(通用字符串列表)混淆了。对不起。我的观点是:TStringList只是一个简单的字符串列表。
在大多数情况下,TStringList过去曾被滥用,TObjectDictionary更好 - 它更快,不需要排序。
如果你需要一个TStrings对象(通常用于UI的东西,因为VCL甚至对XE5都不使用泛型)使用TStringList - 来自TObject的所需转换很烦人但不是showstopper。
TStringList已经使用了很长时间并且具有很多优点,所有这些都被Rob Kennedy提到。
将它用作一对字符串和一个对象的唯一真正的缺点是必须将对象转换为预期的并存储在此列表中的实际类型(在阅读时)并且据我所知Embarcadero没有提供Delphi 2009年及以上的VCL库与通用版TStringList。
为了克服这个限制,我实施了这样的列表供内部使用,并且近3年它符合它的目的所以我决定今天分享它: https://github.com/t00/deltoo#tgenericstringlist
一个重要的注意事项 - 它将默认属性从字符串更改为对象,因为在大多数情况下,当对象存储在列表中时,它也是它最常访问的属性。