正在手动调用 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
块对它们有一些明显的开销。
错误倾向:任何时候你手动做一些编译器可以为你处理的事情,你都有一定的机会犯错误。这种情况实际发生的频率是您比我更清楚的事情,但从统计学上讲,是的,这样做会增加错误倾向。
我总是以
的形式将动态数组的初始化与终结器配对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
块对它们有一些明显的开销。
错误倾向:任何时候你手动做一些编译器可以为你处理的事情,你都有一定的机会犯错误。这种情况实际发生的频率是您比我更清楚的事情,但从统计学上讲,是的,这样做会增加错误倾向。