Delphi:处理字符串不是对象的事实

时间:2010-05-26 02:22:53

标签: delphi delphi-2010

我正在尝试编写一个接受任何TList的函数,并返回TList所有元素的String表示。

我尝试过这样的功能

function ListToString(list:TList<TObject>):String;

这样可以正常工作,除非您无法将TList<String>传递给它。

E2010 Incompatible types: 'TList<System.TObject>' and 'TList<System.string>'

在Delphi中,String不是Object。为了解决这个问题,我写了第二个函数:

function StringListToString(list:TList<string>):String;

这是唯一的解决方案吗?还有其他方法可以将String视为更像“对象”吗?

同样,我也想写一个'equals'函数来比较两个TList。我再次陷入同样的​​问题

function AreListsEqual(list1:TList<TObject>; list2:TList<TObject>):boolean;

有没有办法编写这个函数(也许使用泛型?)所以它也可以处理TList<String>?在尝试创建处理字符串和对象的代码时,是否还有其他技巧或“最佳实践”?或者我只创建每个函数的两个版本?仿制药能帮助吗?

我来自Java背景,但现在在Delphi工作。看起来他们最近在Java世界中向Delphi添加了很多东西(或者也许是从Java复制它们的C#世界)。就像向TObject添加equals()和hashcode(),以及创建一个通用的Collections框架等。我想知道如果你不能将Strings与它们一起使用,这些添加是否非常实用。

[编辑:有人提到过TStringList。到目前为止我已经习惯了,但是我在问TList。我正在努力研究如果使用TList来实现一切(包括字符串)是一种更清洁的方式。]

3 个答案:

答案 0 :(得分:7)

问题不在于stringTObject是不兼容的类型(尽管它们是,)TList<x>TList<y>是不兼容的类型,即使{ {1}}和x本身不是。原因很复杂,但基本上就是这样。

想象一下,你的函数接受了y,你传递了TList<TObject>并且它有效。但是在您的函数中,您在列表中添加了TList<TMyObject>。由于函数签名只知道它正在使用TObjects列表,然后就可以了,突然你违反了一个不变量,当你试图枚举该列表并在里面使用TMyObject实例时,某些东西可能会爆炸。

如果Delphi团队增加了对泛型类型的协方差和逆变的支持,那么你就能安全地做这样的事情,但不幸的是他们还没有完成它。希望我们很快就会看到它。

但是要回到原来的问题,如果你想比较一个字符串列表,就没有必要使用泛型; Delphi有一个名为TStringList的特定字符串列表类,可以在Classes单元中找到,您可以使用它。它有很多用于字符串处理的内置功能,包括将所有字符串连接成单个字符串的三种方法:Text,CommaText和DelimitedText属性。

答案 1 :(得分:1)

虽然它远非最佳,但您可以创建字符串包装类,可能包含一些对字符串进行操作的其他有用函数。 Here是示例类,应该可以增强它以使内存管理更容易,例如使用these methods

我只是建议你的问题的解决方案,我不同意为了一致性的一致性将使代码更好。如果需要, Delphi 对象pascal可能不是首选语言。

答案 2 :(得分:0)

它不干净。情况更糟。使用TList<String>代替TStringList是一个根本不错的想法。

说“我到处都使用泛型”并不是更清晰。事实上,如果你想保持一致,那么就使用它们。避开它们,像大多数delphi开发人员一样避开它们,就像瘟疫一样。

VCL中字符串的所有“列表”都是TStringList类型。大多数delphi应用程序中的大多数对象集合都使用TObjectList,而不是模板化类型。

与整个Delphi平台保持一致并且选择一些奇怪的东西并标准化它,当它是你,而你一个人,做这个古怪的事情时,它不是更干净,更一致。

事实上,我仍然不确定仿制药是否可以安全使用。

如果你开始使用TList,你将无法将它干净地复制到你的Memo.Lines这是一个TStringList,你将创建一个类型不兼容,什么都没有,另外你将失去TStringList中的额外功能。而不是使用TStringList.Text,你必须为自己发明。你也失去了LoadFromFile和SaveToFile等等。字符串数组在Delphi中无处不在,它们几乎总是TStringList。 TList<String>是蹩脚的。