如何使用通用 TList 列表属性
Posted
技术标签:
【中文标题】如何使用通用 TList 列表属性【英文标题】:How to use generic TList List property 【发布时间】:2014-12-22 12:05:31 【问题描述】:DelphiXE7 更新1
在尝试使用 TList.List 属性时,我注意到一个奇怪的行为。如果你看下面的代码,似乎 MyList1.List 返回的数组大小不正确......那么,哪里有 bug?是在我的代码/头中还是在 RTL 中;-)
var
MyList1, MyList2: TList<String>;
begin
MyList1 := TList<String>.Create;
MyList2 := TList<String>.Create;
MyList1.Add('A');
MyList1.Add('B');
MyList1.Add('C');
MyList2.AddRange(MyList1.List); // MyList1.Count = 4 !!!!
ShowMessage(Format('%d, %d', [MyList1.Count, MyList2.Count]));
end;
【问题讨论】:
只使用MyList2.AddRange(MyList1);
。 List
是一个不应该是 public
的属性,恕我直言。无论如何,this
和 this
是您可能感兴趣的。
TLama。你太快了 ;-) 我刚刚编辑了代码以重新表述“真正的”问题。不是分配本身,而是错误的 (?) TListthis question
。
好的,我现在完全明白了。谢谢
这是一个 RTL 设计缺陷。 List
属性读取 FList
字段,而它应该调用 ToArray
方法。
【参考方案1】:
List
属性是原始的底层存储。该类作为减少重新分配次数的优化,会过度分配此存储。这具有List
返回的数组可能比列表本身具有更多元素的效果。然后,您可以添加更多项目,而无需强制重新分配,直到达到容量。
因此,这种行为是意料之中的。使用Count
找出列表中有多少项已定义。
【讨论】:
以上是关于如何使用通用 TList 列表属性的主要内容,如果未能解决你的问题,请参考以下文章