Думайте о динамическом массиве как о конструкции более низкого уровня, чем TStringList
или TList<T>
.
Динамический массив предлагает прямой доступ к элементам через указатель. Язык скрывает указатель от вас, но это, по сути, все, чем является динамический массив. Но вы отвечаете за любое перераспределение, и если вы хотите вставить или удалить элементы, вам нужно написать код и разобраться с деталями.
Классы коллекций более высокого уровня, TStringList
и TList<T>
, построены поверх динамических массивов. Вот как хранится содержимое внутри. Но классы коллекций завершают это за вас. Операции более высокого уровня, такие как вставка и удаление и многие другие, предоставляются в виде методов. По сути, эти классы коллекций обеспечивают гораздо больше удобства, чем необработанные динамические массивы.
Для иллюстрации рассмотрим действие вставки элемента. Для динамического массива вы должны сделать это:
- Измените размер массива.
- Переместите элементы, которые находятся после точки вставки, из позиции i в позицию i+1.
- Назначить вставленный элемент.
Если вам нужно написать этот код более одного раза, что ж, вы делаете это неправильно.
Для коллекции высокого уровня вы пишете:
List.Insert(Index, Value);
и пусть класс позаботится о деталях.
Обратите внимание, что по историческим причинам, а также потому, что строки особенно важны, разработчики, как правило, используют специально выделенный класс TStringList
, а не TList<string>
. Опять же, выделенный класс предлагает функциональные возможности помимо TList<string>
, поскольку он специализируется на строках и может предлагать функциональные возможности, предназначенные для строк. Опять же, специальный класс предлагает удобство.
Одно из мест, где динамические массивы пригодятся, — это когда вы не хотите брать на себя шаблон управления жизненным циклом. Таким образом, для настольных компиляторов, у которых нет ARC для классов, вам необходимо явно уничтожить TList<T>
экземпляров. Но у динамических массивов время жизни управляется ARC. Если вы синтезируете массивы за один раз, а затем не изменяете их размер, то проблема управления временем жизни может сделать массивы более удобными в использовании.
Как правило, отдавайте предпочтение классам коллекций высокого уровня. Они должны быть вашим выбором по умолчанию. Иногда динамические массивы являются правильным выбором, но это, как правило, для более специализированных сценариев.
17.06.2014