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

前端之家收集整理的这篇文章主要介绍了Delphi:处理字符串不是对象的事实前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个函数,它接受任何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的一切(包括字符串)是一种更清洁的方式.]

解决方法

你的问题不是那个字符串和TObject是不兼容的类型,(虽然它们是,)它是TList< x>和TList< y>是不兼容的类型,即使x和y本身不是.原因很复杂,但基本上就是这样.

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

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

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

猜你在找的Delphi相关文章