Динамические массивы являются управляемыми типами и поэтому всегда инициализируются в nil
, что эквивалентно SetLength(..., 0)
.Вам никогда не нужно этого делать.
Единственный раз, когда вы можете быть пойманным, это когда вы возвращаете динамический массив из процедуры как возвращаемое значение функции.Фактически возвращаемое значение функции - это просто неявный параметр var.
Рассмотрим следующий код:
function Foo: string;
begin
Result := Result + 'X';
end;
var
i: Integer;
begin
for i := 1 to 5 do
Writeln(Foo);
Writeln(Foo);
Writeln(Foo);
end;
Выход
X
XX
XXX
XXXX
XXXXX
X
X
Что происходит здесь, так это то, что компилятор из-за оптимизации выбирает не переинициализировать неявную локальную переменную внутри цикла.
Это может время от времени вас ловить, поэтому я рекомендую установить nil returnзначения, которые являются динамическими массивами, строками, интерфейсами и т. д. Вам не нужно делать это для членов класса, и более логично позволить конструктору автоматически инициализировать их нулями.