Arrays Delphi-为什么使用VarArrayPut?

Arrays Delphi-为什么使用VarArrayPut?,arrays,delphi,variant,Arrays,Delphi,Variant,我正在使用Delphi Rio来控制Excel。我正在读写整个列,所以我使用VarArrayCreate创建一个变量数组来读取列的数据。我更新数据的特定部分,然后将更新写回变量数组。完成后,我将整个变量数组写回我的列 在数组中循环时,我读取数组中的单个元素。。。。并可能写回数组中的元素 ... read from the array CellText := arrData[i, 1]; ... possibly update data ... write the updated data b

我正在使用Delphi Rio来控制Excel。我正在读写整个列,所以我使用VarArrayCreate创建一个变量数组来读取列的数据。我更新数据的特定部分,然后将更新写回变量数组。完成后,我将整个变量数组写回我的列

在数组中循环时,我读取数组中的单个元素。。。。并可能写回数组中的元素

... read from the array
CellText := arrData[i, 1];

... possibly update data

... write the updated data back to the array
arrData[i,1] := CellPadded;

这是毫无疑问的。我的问题与将更新写回数组有关。我遇到了VarArrayPut函数。为什么我要使用它,而不是像上面的代码那样直接将数据放回数组?

简单的答案是
VarArrayPut
与数组访问器(方括号语法)相同,最后它们都在unit
System.Variants中调用内部过程
\u VarArrayPut
。同样,使用方括号或
VarArrayGet
从数组中读取值将导致调用内部函数
\u VarArrayGet
。通过进入(F7)赋值
arrData[i,1]:=CellPadded,您可以轻松地检查自己在调试会话期间

这就是说,变体数组访问器只是Delphi编译器提供的一种语法糖,可以使代码更短、更可读,但这是个人喜好的主题。考虑以下事项:

arrData[i, 1] := CellPadded;
{ vs }
VarArrayPut(arrData, CellPadded, [i, 1]);
如果您执行了大量数据操作,并且在处理过程中没有调整数组的大小,那么最好在。。通过绕过
\u VarArrayGet
\u VarArrayPut
内部执行的所有健全性检查和API调用直接访问阵列数据来获得一些额外性能:

{ untested, use at your own risk }
{$POINTERMATH ON}
var
  Data: PVariant; { in case of variant array of varVariant }
  LBound1, LBound2, HBound2: Integer;

Data := VarArrayLock(arrData);
try
  LBound1 := VarArrayLowBound(V, 1);
  LBound2 := VarArrayLowBound(V, 2);
  HBound2 := VarArrayHighBound(V, 2);
  { access element value at [i, j] }
  (Data + i - LBound1 + (j - LBound2) * (HBound2 - LBound2 + 1))^ := CellPadded;

  { ... }

finally
  VarArrayUnlock(arrData);
end;

这当然不适用于锯齿阵列