该Capacity
属性几乎是理想的,因为它将在内部数组中分配正确数量的条目。但是,它有一个不幸的缺点:
- 新分配的内存未初始化。
- 元素的数量
Strings.Count
不会更新。
由于 Delphi 组件体系结构引用了基本类型TStrings
,因此您可以提供可以支持更有效的调整大小功能的具体子类。例如,考虑以下实现TList.SetCount
。
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
for I := FCount - 1 downto NewCount do
Delete(I);
FCount := NewCount;
end;
更新容量后,如果有新分配的内存,则使用 初始化FillChar
。这比一次添加/删除一项要有效得多。
因此,您可以提供自己独立的子类具体实现,或者简单地复制包含适当方法TStrings
的 Delphi 的副本。TStringList
SetCount
尽管如此,我发现这部分代码不太可能会遇到任何性能问题,因此您自己的解决方案包含在适当的实用方法中就足够了。大卫的回答也很好,虽然我个人认为“类助手”功能没有那么有用。实现类助手的“旧方式”更加通用。