TStringList和TList<string>的区别

31

使用标准的区别是什么?

type 
  sl: TStringList 

与使用通用的TList相比

type 
  sl: TList<string>

?

就我所见,两者的行为完全相同。

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

是否有某些情况下其中一种方法比另一种更好?

谢谢!


1
尝试在两个中添加“Hello”+ sLineBreak +“World”。行为不同。 - Sir Rufo
8个回答

42
  • TStringList是TStrings的后代。
  • TStringList知道如何按字母顺序对自身进行排序。
  • TStringList有一个Objects属性。
  • TStringList不会使您的代码与所有以前版本的Delphi不兼容。
  • TStringList可以用作已发布属性。(一个错误目前防止泛型类被发布。)

4
TStringList是TStrings的一个子类,这是它的主要特点:在VCL中可以像使用TStrings一样使用它。因此,在代码中使用TStrings非常方便。 - Arnaud Bouchez
您正在回复一篇已经有五年历史的答案,@Bernd。如果您想知道发布属性是否可以具有泛型类类型,请首先尝试它,其次发表一个真正的问题来询问它。当您发布问题时,人们会期望您已经尝试过,所以请确保报告您的经验,并提到您使用的是哪个版本。在2008年,我显然没有谈论任何比Delphi 2009更新的版本。 - Rob Kennedy
那是个好观点!我没开动我的脑筋。当然没有其他版本比2009更好,因为泛型是在那个版本引入的,那时候市场上也没有其他Delphi版本发布。但现在我们已经有了相关记录;-) - coding Bott

12

在Delphi引入泛型之前,TStringList已经存在很长一段时间。因此,它积累了一些有用的功能,泛型字符串列表没有这些功能。

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

TStringList具有基本的TList类型方法,并且还具有其他专门处理字符串的方法,例如.SaveToFile()和.LoadFromFile()。

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


2
  • TStringList是TStrings的一个派生类,因此它与TMemo的Lines属性、TListbox和TComboBox的Items以及其他VCL组件兼容。 所以可以使用 cbList.Items := StringList; // 内部调用TStrings.Assign方法

但是你可以使用cbList.Items.AddStrings(ListOfString.toArray)或类似的方法。顺便说一句,真正的问题是介绍TList<string>和TArray<string>之间的区别:-D - Arioch 'The

2

如果您需要向后兼容性,请使用TStringList,如果您需要向前兼容性(也许在将来选项更改为Int64s的字符串列表),那么请使用TList。


2
TStringList是Delphi中非常多才多艺的一个类。我经常使用它的Objects属性(并且有时滥用;-))。将分隔符字符串快速转换为像TMemo和类似的控件(TListBox,TComboBox等)非常有趣。

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

编辑:我将TList(指针列表)与TList(字符串的通用列表)混淆了。对此我很抱歉。我的观点仍然成立:TStringList远不止于简单的字符串列表。


2

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


1

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

如果您需要一个TStrings对象(通常用于UI方面,因为即使对于XE5,VCL也不经常使用泛型),请使用TStringList - 从TObject强制转换很烦人,但不是阻碍。


0

TStringList已经被使用了太长时间,并且有许多优点,这些优点都被Rob Kennedy提到了。

唯一真正的缺点是将其用作字符串和对象对时需要将对象强制转换为实际类型(在读取时),据我所知,Embarcadero没有为Delphi 2009及以上版本的VCL库提供TStringList的通用版本。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接