正在手动调用 SetLength(array, 0);有缺点吗?

Is manually calling SetLength(array, 0); having a drawback?

我总是以

的形式将动态数组的初始化与终结器配对
finally 
  SetLength(Array, 0); 
end;

确切地知道数组何时达到 "destroyed" 感觉更自然,如果需要的话,我可以通过已经有 "finally" 可用来更顺畅地从数组过渡到 TList。

然而,这种方法使源代码更加缩进。这种方法是否有任何缺点 - 可读性、可维护性、可扩展性、性能、错误率?

我写的示例代码:

var
  A1: array of Integer;
  A2: array on Boolean;
  A3: array of string;
begin
  SetLength(A1, 10);
  try
    ...
    SetLength(A2, 20);
    try
      ...
      SetLength(A3, 30);
      try
        ...
      finally
        SetLength(A3, 0);
      end;
    finally
      SetLength(A2, 0);
    end;
  finnally
    SetLength(A1, 0);
  end;
end;

Is there any drawback in this approach - readability, maintainability, extensibility, performance, error proneness?

可读性:绝对!

可维护性、可扩展性:如您所说,这将使向 TList 的过渡更加简单。但是,您多久从一个数组开始,然后将其转换为 TList

性能:编译器已经完成了您正在做的事情。现在它发生了两次。无事可做时对 SetLength 的冗余调用具有最小的开销,但是(至少在 32 位中)那些 try-finally 块对它们有一些明显的开销。

错误倾向:任何时候你手动做一些编译器可以为你处理的事情,你都有一定的机会犯错误。这种情况实际发生的频率是您比我更清楚的事情,但从统计学上讲,是的,这样做会增加错误倾向。