使用标准的区别是什么?
type
sl: TStringList
与使用通用的TList相比
type
sl: TList<string>
?
就我所见,两者的行为完全相同。
这只是另一种做同样事情的方式吗?
是否有某些情况下其中一种方法比另一种更好?
谢谢!
使用标准的区别是什么?
type
sl: TStringList
与使用通用的TList相比
type
sl: TList<string>
?
就我所见,两者的行为完全相同。
这只是另一种做同样事情的方式吗?
是否有某些情况下其中一种方法比另一种更好?
谢谢!
在Delphi引入泛型之前,TStringList已经存在很长一段时间。因此,它积累了一些有用的功能,泛型字符串列表没有这些功能。
泛型版本只是创建了一个新类型,该类型与TList相同,但作用于String类型。(.Add()、.Insert()、.Remove()、.Clear()等)
TStringList具有基本的TList类型方法,并且还具有其他专门处理字符串的方法,例如.SaveToFile()和.LoadFromFile()。
如果需要向后兼容,则TStringList绝对是最佳选择。
如果需要增强处理字符串列表的功能,则TStringList也是最佳选择。
如果您想使用任何类型的列表处理基本编码基础知识,则可能需要远离TStringList。
如果您需要向后兼容性,请使用TStringList,如果您需要向前兼容性(也许在将来选项更改为Int64s的字符串列表),那么请使用TList。
我不太喜欢TList,因为TStringList可以满足我的需求,而无需处理指针(因为Tlist是指针值列表)。
编辑:我将TList(指针列表)与TList(字符串的通用列表)混淆了。对此我很抱歉。我的观点仍然成立:TStringList远不止于简单的字符串列表。
从内存的角度来看,TStringList的内存使用量随着每个项目添加的TObject指针的大小而增加。TList的内存使用量随着每个项目添加的指针的大小而增加。如果只需要一个字符串数组而不需要搜索、替换、排序或关联操作,则动态数组(字符串数组)应该足够了。虽然这缺乏对TStringList或TList的良好内存管理,但理论上应该使用更少的内存。
对于过去滥用TStringList的大多数目的而言,TObjectDictionary更好 - 它更快且不需要排序。
如果您需要一个TStrings对象(通常用于UI方面,因为即使对于XE5,VCL也不经常使用泛型),请使用TStringList - 从TObject强制转换很烦人,但不是阻碍。
TStringList已经被使用了太长时间,并且有许多优点,这些优点都被Rob Kennedy提到了。
唯一真正的缺点是将其用作字符串和对象对时需要将对象强制转换为实际类型(在读取时),据我所知,Embarcadero没有为Delphi 2009及以上版本的VCL库提供TStringList的通用版本。
为了克服这个限制,我实现了这样一个列表供内部使用,近3年来它一直在发挥作用,所以我决定今天分享它:https://github.com/t00/deltoo#tgenericstringlist
一个重要的注意事项-它将默认属性从Strings更改为Objects,因为在大多数情况下,当对象存储在列表中时,它也是最常访问的属性。