TStringList与TList <string> </string>

时间:2008-11-10 22:50:25

标签: delphi generics tstringlist

使用标准

的区别是什么
type 
  sl: TStringList 

与使用通用TList相比

type 
  sl: TList<string>

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

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

是否存在一个比另一个好的情况?

谢谢!

8 个答案:

答案 0 :(得分:42)

  • TStringList是TStrings的后代。
  • TStringList知道如何按字母顺序排序。
  • TStringList有一个Objects属性。
  • TStringList不会使您的代码与所有以前版本的Delphi不兼容。
  • TStringList可以用作已发布的属性。 (目前,一个错误会阻止通用类的发布。)

答案 1 :(得分:12)

在仿制药出现之前,TStringList已经在Delphi中存在了很长时间。因此,它构建了一些有用的功能,这些功能是通用的字符串列表所不具备的。

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

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

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

答案 2 :(得分:2)

  • 由于TStringList是TStrings的后代,它与TMemo的Lines属性,TListbox和TComboBox的项以及其他VCL组件兼容。 所以可以使用   cbList.Items:= StringList; //内部调用TStrings.Assign

答案 3 :(得分:2)

我可能会说如果你想要向后兼容性使用TStringList,如果你想要向前兼容性(可能是将该字符串列表更改为将来的Int64列表的选项),那么请选择TList。

答案 4 :(得分:2)

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

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

编辑:我把TList(指针列表)与TList(通用字符串列表)混淆了。对不起。我的观点是:TStringList只是一个简单的字符串列表。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

在大多数情况下,TStringList过去曾被滥用,TObjectDictionary更好 - 它更快,不需要排序。

如果你需要一个TStrings对象(通常用于UI的东西,因为VCL甚至对XE5都不使用泛型)使用TStringList - 来自TObject的所需转换很烦人但不是showstopper。

答案 7 :(得分:0)

TStringList已经使用了很长时间并且具有许多优点,所有这些都由Rob Kennedy提及。

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

为了克服这个限制,我实施了这样的内部使用清单,近3年来它的目的是为了达到目的所以我今天决定分享它:https://github.com/t00/deltoo#tgenericstringlist

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