我将维护并移植到 Delphi XE2 一堆非常旧的 Delphi 代码,这些代码充满了VarArrayCreate构造,以伪造具有不为零的下限的动态数组。
使用Variant类型的缺点是:
- 比原生数组慢很多(代码做了很多复杂的财务计算,所以速度很重要)
- 类型不安全(尤其是意外使用了错误的
var...
常量,并且 Variant 系统开始进行不需要的转换或舍入时)
如果我可以使用动态数组,两者都可能变得没有意义。
变体数组的好处是它们可以有非零的下限。
我记得动态数组过去总是从零的下限开始。
这仍然是真的吗?换句话说:是否可以让动态数组从不同于零的边界开始?
作为一个特定案例的前后示例的说明(单维,但代码中充满了多维数组,除了varDouble之外,代码还使用了TVarData允许使用的各种其他varXXX
数据类型):
function CalculateVector(aSV: TStrings): Variant;
var
I: Integer;
begin
Result := VarArrayCreate([1,aSV.Count-1],varDouble);
for I := 1 to aSV.Count-1 do
Result[I] := CalculateItem(aSV, I);
end;
CalculateItem
函数Double
返回。界限是从1
到aSV.Count-1
。
当前的替换是这样的,用 Result 的空间零元素来改进编译时间检查:
type
TVector = array of Double;
function CalculateVector(aSV: TStrings): TVector;
var
I: Integer;
begin
SetLength(Result, aSV.Count); // lower bound is zero, we start at 1 so we ignore the zeroth element
for I := 1 to aSV.Count-1 do
Result[I] := CalculateItem(aSV, I);
end;