gpt4 book ai didi

德尔福: Handling the fact that Strings are not Objects

转载 作者:行者123 更新时间:2023-12-03 14:59:48 26 4
gpt4 key购买 nike

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

我尝试了这样的功能

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

这工作得很好,除了你不能传递 TList<String>到它。

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

在 Delphi 中,字符串不是对象。为了解决这个问题,我编写了第二个函数:

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

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

同样,我也想编写一个“equals”函数来比较两个 TList。我又遇到了同样的问题

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

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

我有 Java 背景,但现在在 Delphi 工作。看起来他们最近从 Java 世界(或者可能是 C# 世界,从 Java 复制了它们)向 Delphi 添加了很多东西。比如向 TObject 添加 equals() 和 hashcode(),以及创建通用的 Collections 框架等。我想知道如果您不能使用字符串,这些添加是否非常实用。

[编辑:有人提到了 TStringList。到目前为止我已经使用过它,但我正在询问 TList。我正在尝试弄清楚对所有内容(包括字符串)使用 TList 是否是一种更干净的方法。]

最佳答案

你的问题不是stringTObject是不兼容的类型,(尽管它们是)就是 TList<x>TList<y>是不兼容的类型,即使 xy他们自己却不是。原因很复杂,但基本上是这样的。

想象一下你的函数接受了 TList<TObject> ,你传入了 TList<TMyObject>它起作用了。但随后在您的函数中添加了 TIncompatibleObject到列表中。由于函数签名只知道它正在处理 TObject 列表,因此它可以工作,突然间您违反了一个不变量,当您尝试枚举该列表并使用其中的 TMyObject 实例时,某些内容可能会爆炸。

如果 Delphi 团队添加了对泛型类型的协变和逆变的支持,那么您就可以安全地执行类似的操作,但不幸的是他们还没有解决这个问题。希望我们很快就能看到它。

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

关于德尔福: Handling the fact that Strings are not Objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com