0

我总是将动态数组的初始化与终结器配对,形式为

finally 
  SetLength(Array, 0); 
end;

确切地知道数组何时“被破坏”并允许我在需要时通过已经有一个“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;
4

1 回答 1

4

这种方法是否有任何缺点——可读性、可维护性、可扩展性、性能、易错性?

可读性:绝对!

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

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

容易出错:每当您手动执行编译器可以为您处理的事情时,您都有一定的机会犯错误。实际发生的频率是您比我更清楚的事情,但是从统计上讲,是的,这样做会增加出错的可能性。

于 2015-01-02T22:53:43.477 回答