2015-01-02 3 views
0

Я всегда сопряжение инициализации динамического массива с финализацией в видеРучно вызывает SetLength (массив, 0); имеет недостаток?

finally 
    SetLength(Array, 0); 
end; 

Он чувствует себя более естественно, чтобы точно знать, когда массив получает «уничтожен» и позволяет мне более плавный переход от массивов в 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; 
+0

Ни один из этих вызовов в 'SetLength' не требуется, поскольку переменные выходят из области действия в конце' end; 'и автоматически освобождаются. Если переменные были более широкими по охвату (единичные или глобальные), это может иметь значение. Вы также можете удалить все блоки 'try..finally', если это все, для чего они предназначены, что делает весь вопрос об отступлении спорным. –

+0

Сумма отступлений полностью зависит от вас. Если вы хотите, у вас может быть одна процедура с 100 строками кода или 100 процедур с 1 строкой кода. Отступ кода не обязательно влияет на производительность. Однако в этом случае вы можете инициализировать/uninitialize эти массивы вместе и иметь только один блок 'try..finally', хотя и не рекомендуется. –

+0

@Jerry: Абсолютно ни один из этих вызовов в SetLength или try..finally не нужны. –

ответ

4

Есть ли недостаток этого подхода - читаемость, ремонтопригодность, расширяемость, производительность, ошибка Склонность?

Считываемость: определенно!

Поддержание работоспособности, расширяемость: как вы говорите, это упростит переход на TList. Но как часто вы начинаете с массива, а затем конвертируете его в TList?

Производительность: Компилятор уже делает именно то, что вы делаете. Теперь это происходит дважды. Резервные вызовы на SetLength, когда ничего не нужно делать, имеют минимальные накладные расходы, но (по крайней мере, на 32 бита) эти блоки try-finally имеют заметные накладные расходы.

Ошибка: каждый раз, когда вы делаете что-то вручную, что компилятор может вам пригодиться, есть вероятность, что вы допустили ошибку. Как часто это происходит на самом деле, это то, что вы бы знали лучше меня, но статистически, да, вы увеличиваете склонность к ошибкам, делая это.

+2

И обратите внимание, что есть неявные блоки finally try вокруг любого тела функции, которое использует dynarrays, поэтому на самом деле есть 6 (!!!) вложенных try finally блоков в примере кода. –