Оператор ReDim (Visual Basic)

Перераспределяет область хранения для переменной массива.

Синтаксис

ReDim [ Preserve ] name(boundlist) [ ,  name(boundlist) [, ... ] ]  

Детали

Термин Определение
Preserve Необязательно. Модификатор, используемый для сохранения данных в существующем массиве при изменении размера только последнего измерения.
name Обязательный. Имя переменной массива. См. раздел Declared Element Names.
boundlist Обязательный. Список границ для всех измерений переопределенного массива.

Замечания

Для изменения размера одного или нескольких из уже объявленных измерений массива можно использовать оператор ReDim. Если у вас есть большой массив и некоторые из входящих в него элементов больше не требуются, ReDim позволяет освободить память, уменьшив размер массива. Если же массив требует дополнительных элементов, ReDim может их добавить.

Оператор ReDim предназначен только для массивов. Он не подходит для скалярных величин (переменных, содержащих единственное значение), коллекций или структур. Обратите внимание, что при объявлении переменной типа Array у оператора ReDim не будет достаточной информации о типе для создания нового массива.

Оператор ReDim можно использовать только на уровне процедуры. В связи с этим контекст объявления для переменной должен быть процедурой; он не может быть исходным файлом, пространством имен, интерфейсом, классом, структурой, модулем или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.

Правила

  • Несколько переменных. Можно изменить размер нескольких переменных массива в одной инструкции объявления и указать nameboundlist части для каждой переменной. Переменные разделяются запятыми.

  • Границы массива. Каждая запись в boundlist может указывать нижние и верхние границы этого измерения. Нижняя граница всегда 0 (ноль). Верхняя граница представляет собой наибольшее возможное значение индекса для этого измерения, но не длину измерения (она равна верхней границе плюс один). Индекс для каждого измерения может варьироваться от 0 до значения верхней границы.

    Число измерений в boundlist должно совпадать с исходным числом измерений (рангом) массива.

  • Типы данных. Оператор ReDim не может изменить тип данных переменной массива или его элементов.

  • Инициализация. Инструкция ReDim не может предоставлять новые значения инициализации для элементов массива.

  • Ранга. Оператор ReDim не может изменить ранг (число измерений) массива.

  • Изменение размера с помощью сохранения. При использовании Preserveможно изменить размер только последнего измерения массива. Для всех остальных измерений необходимо указывать привязку существующего массива.

    Например, в одномерных массивах можно изменить это измерение и в то же время сохранить все содержимое массива, поскольку изменяется только одно, последнее, измерение. Если же массив имеет два или больше измерений, то с помощью оператора Preserve можно изменить только последнее измерение массива.Preserve

  • Свойства. Можно использовать в свойстве, в котором содержится ReDim массив значений.

Поведение

  • Замена массива. ReDim освобождает существующий массив и создает новый массив с тем же рангом. Новый массив заменяет освобожденный массив в переменной массива.

  • Инициализация без сохранения. Если не указано Preserve, ReDim инициализирует элементы нового массива с помощью значения по умолчанию для их типа данных.

  • Инициализация с помощью preserve. При указании PreserveVisual Basic копирует элементы из существующего массива в новый массив.

Пример

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

Dim intArray(10, 10, 10) As Integer
ReDim Preserve intArray(10, 10, 20)
ReDim Preserve intArray(10, 10, 15)
ReDim intArray(10, 10, 10)

Оператор Dim создает новый массив с тремя измерениями. Каждое измерение объявляется с границей 10, поэтому индекс массива для каждого измерения может варьироваться в диапазоне от 0 до 10. В приведенном ниже описании эти три измерения называются слоем, строкой и столбцом.

Первый оператор ReDim создает новый массив, который заменяет существующий массив в переменной intArray. Оператор ReDim копирует все элементы из существующего массива в новый массив. Кроме того, он добавляет по десять столбцов в конец каждой строки каждого слоя и инициализирует элементы в этих новых столбцах со значением 0 (значение параметра Integer, который является типом элемента массива, по умолчанию).

Второй оператор ReDim создает еще один массив и копирует в него все подходящие элементы. При этом в каждой строке каждого слоя теряются пять последних столбцов. Это не проблема, если данные столбцы вам больше не нужны. Уменьшение размера большого массива позволяет освободить память, которая больше не требуется.

Третий оператор ReDim создает еще один массив и удаляет еще пять столбцов в конце каждой строки каждого слоя. В данном случае он не копирует существующие элементы. Этот оператор возвращает массиву первоначальный размер. Поскольку оператор не включает модификатор Preserve, он приводит все элементы массива к исходным значениям по умолчанию.

Дополнительные примеры см. в разделе "Массивы".

См. также