我总是将动态数组的初始化与
形式的终结器配对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;
答案 0 :(得分:4)
这种方法有任何缺点 - 可读性,可维护性,可扩展性,性能,容易出错吗?
可读性:绝对是!
可维护性,可扩展性:正如您所说,这将使转换为TList
更简单。但是,您多久开始使用一个数组,然后将其转换为TList
?
性能:编译器已完全按照您的要求执行操作。现在它发生了两次。当没有任何事可做时,对SetLength
的冗余调用具有最小的开销,但(至少在32位)这些try-finally
块对它们有一些明显的开销。
错误倾向:无论何时您手动执行编译器可以为您处理的事情,您都有可能犯错误。实际发生的频率是你比我更清楚的事情,但从统计上来说,是的,你这样做会增加错误倾向。