在编写测试程序时,我遇到了以下示例代码:
var MyData: TArray<TDataRec>;
procedure AppendData(AItem: TOrderByCustomer);
var i: Integer;
tmp: TArray<TOrderByCustomer>;
begin
SetLength(tmp, Length(MyData)+1);
for i:=0 to High(MyData) do
tmp[i]:=MyData[i];
tmp[Length(tmp)-1]:=AItem;
MyData:=tmp;
end;
过去,我仅使用SetLength()来更改实际数组的长度。为什么此示例的作者创建了一个临时数组,然后将所有值分配给它,然后将其复制回原始数组?是有充分的理由吗?还是他只是很奇怪?
答案 0 :(得分:5)
此代码没有充分的理由。它引入了不必要复制的潜在开销。该函数应这样写:
procedure AppendData(const AItem: TOrderByCustomer);
var
N: Integer;
begin
N := Length(MyData);
SetLength(MyData, N + 1);
MyData[N] := AItem;
end;