【问题标题】:Delphi Stringlist in Record记录中的 Delphi 字符串列表
【发布时间】:2011-07-11 02:40:09
【问题描述】:

是否可以在记录中包含字符串列表? EG

TImportStats = record
  ATotal:Integer;
  BTotal:String;
  AList:TStringist;
end;

如果我认为我需要在使用记录之前创建它?

【问题讨论】:

    标签: delphi record tstringlist


    【解决方案1】:

    我知道这可能已经晚了,但解决您的问题的最优雅的方法是创建一个 TStringList 的子类,其中 ATotal 和 BTotal 作为其中的两个新元素。然后你可以简单地创建和销毁它,只要你认为合适。这个解决方案干净简单。

    【讨论】:

      【解决方案2】:

      如果字符串列表仅用于 TImportStats 记录的本地范围, 您可能想在 Code Central 中查看 StringList value implementation。

      这避免了 try、create、finally、destroy 开销。

      【讨论】:

        【解决方案3】:

        虽然这是完全合法的,但寻找其他方法可能是明智的。你说的时候指出了问题:

        我想我需要创建它 在使用记录之前

        不仅如此,你还需要找到一个好的时机来摧毁它。如果您忘记这样做,则不会出现错误,但您的程序会泄漏内存。

        如果记录是字符串列表的所有者,那么最好将它包含在一个类中。这样字符串列表的构造和销毁将遵循所有 Delphi 开发人员都熟悉的构造函数/析构函数模式。

        如果记录不拥有字符串列表,但只是在字符串列表的生命周期内引用它,那么记录就可以了。但是,如果您这样做,请确保记录的生命周期包含在字符串列表的生命周期内,这样您就不会携带过时的引用。

        【讨论】:

        • 此外,对于 OP 来说,了解对象记录成员只是指向对象的指针也很重要。也就是说,如果a和b是TImportStats类型的两条记录,那么a := b将使a和b指向相同的TStringList对象,所以对a.AList 的任何更改也会影响b.AList,反之亦然。此外,旧的AList 或a 将留在内存中,但无法访问它,因此存在内存泄漏(除非您在程序的其他位置存储了指向该对象的指针)。大卫当然知道这一点;我只是在向 OP 解释。
        【解决方案4】:

        是的,这应该可以。在您创建字符串列表之前,AList 将(不可用)。因此,您可以在不创建 stringlist 的情况下使用记录的其他元素,但您必须在使用之前创建 stringlist 元素。此外,您有责任在完成后释放每个字符串列表。

        【讨论】:

        • 请注意,如果您在 R2 := R1 之类的赋值中使用记录,则仅分配指针。两条记录都将指向 same StringList。
        • @Chris, @Sertac:这取决于ImportStats: TImportStats 的声明位置。如果它是一个局部变量,@Sertac 是正确的——它将被“分配”但指向垃圾(当然,不会有 TStringList 对象)。另一方面,如果它是一个全局变量,在implementation 部分的某处声明,它将用零填充,即nil。
        • 当然,@Robert 的评论非常重要。
        • @Chris - Andreas 是对的,如果它是全局的或在一个类中,它将为零,如果是本地的,则不是。
        • @Cosmin:我认为 Chris 只是说您可以立即执行 ATotal := 5,但您不能执行 AList.Add('alpha'),除非您首先通过 AList := TStringList.Create 创建对象。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        相关资源
        最近更新 更多