手动调用SetLength(数组,0);有缺点?

时间:2015-01-02 22:47:39

标签: delphi dynamic-arrays delphi-xe7 finalization

我总是将动态数组的初始化与

形式的终结器配对
finally 
  SetLength(Array, 0); 
end;

确切地知道阵列何时被摧毁"感觉更自然。并且如果需要的话,允许我更平滑地从数组转换到TList,因为已经有了#34;最终"可用。

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

我写的示例代码:

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;

1 个答案:

答案 0 :(得分:4)

  

这种方法有任何缺点 - 可读性,可维护性,可扩展性,性能,容易出错吗?

可读性:绝对是!

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

性能:编译器已完全按照您的要求执行操作。现在它发生了两次。当没有任何事可做时,对SetLength的冗余调用具有最小的开销,但(至少在32位)这些try-finally块对它们有一些明显的开销。

错误倾向:无论何时您手动执行编译器可以为您处理的事情,您都有可能犯错误。实际发生的频率是你比我更清楚的事情,但从统计上来说,是的,你这样做会增加错误倾向。