Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Время существования объявленного элемента — это период времени, в течение которого он доступен для использования. Переменные являются единственными элементами, имеющими время существования. Для этого компилятор обрабатывает параметры процедуры и функцию в качестве особых случаев переменных. Время существования переменной представляет период времени, в течение которого он может содержать значение. Его значение может измениться в течение всего времени существования, но оно всегда содержит некоторое значение.
Разные жизни
Переменная-член (объявленная на уровне модуля вне любой процедуры) обычно имеет то же время существования, что и элемент, в котором он объявлен. Независимая переменная, объявленная в классе или структуре, существует в виде отдельной копии для каждого экземпляра класса или структуры, где она объявлена. Каждая такая переменная имеет то же время существования, что и его экземпляр.
Shared
Однако переменная имеет только одно время существования, которое длится в течение всего времени выполнения приложения.
Локальная переменная (объявленная внутри процедуры) существует только во время выполнения процедуры, в которой она объявлена. Это также относится к параметрам этой процедуры и к любой возвращаемой функции. Однако если эта процедура вызывает другие процедуры, локальные переменные сохраняют свои значения во время выполнения вызываемой процедуры.
Начало жизненного пути
Время существования локальной переменной начинается, когда элемент управления вводит процедуру, в которой она объявлена. Каждая локальная переменная инициализирована в значение по умолчанию для его типа данных, как только процедура начнет выполняться. При обнаружении Dim
инструкции, устанавливающей начальные значения, эти переменные принимают соответствующие значения, даже если ваш код уже присвоил им другие значения.
Каждый элемент переменной структуры инициализирован так, как если бы он был отдельной переменной. Аналогичным образом каждый элемент переменной массива инициализируется по отдельности.
Переменные, объявленные в блоке внутри процедуры (например, в цикле For
), инициализируются при входе в процедуру. Инициализации вступают в силу независимо от того, выполняет ли ваш код этот блок.
Окончание срока службы
После завершения процедуры значения локальных переменных не сохраняются, а Visual Basic освобождает память. При следующем вызове процедуры все её локальные переменные создаются заново и повторно инициализированы.
Когда экземпляр класса или структуры завершается, его не общие переменные теряют память и их значения. Каждый новый экземпляр класса или структуры создает и повторно инициализирует свои не общие переменные. Однако переменные сохраняются до тех пор, Shared
пока приложение не перестанет работать.
Продление срока службы
Если объявить локальную переменную с Static
ключевым словом, время его существования превышает время выполнения процедуры. В следующей таблице показано, как объявление процедуры определяет, сколько времени Static
существует переменная.
Расположение процедуры и общий доступ | Начинается срок существования статической переменной | Время существования статических переменных заканчивается |
---|---|---|
В модуле (общий по умолчанию) | При первом вызове процедуры | Когда приложение перестанет работать |
В классе Shared (процедура не является членом экземпляра) |
При первом вызове процедуры либо на конкретном экземпляре, либо на самом имени класса или структуры | Когда приложение перестанет работать |
В экземпляре класса, а не Shared (процедура является членом экземпляра) |
При первом вызове процедуры для конкретного экземпляра | Когда экземпляр освобождается для удаления сборщиком мусора (GC) |
Статические переменные того же имени
Статические переменные можно объявить с одинаковым именем в нескольких процедурах. При этом компилятор Visual Basic считает каждую такую переменную отдельным элементом. Инициализация одной из этих переменных не влияет на значения других. То же самое применяется, если вы определяете процедуру с набором перегрузок и объявляете статическую переменную с одинаковым именем в каждой перегрузке.
Содержащие элементы для статических переменных
Вы можете объявить статическую локальную переменную в классе, то есть внутри процедуры в этом классе. Однако нельзя объявить статическую локальную переменную в структуре как элемент структуры или как локальную переменную процедуры в этой структуре.
Пример
Описание
В следующем примере объявляется переменная со статическим ключевым словом. Обратите внимание, что ключевое слово Dim
не требуется, если оператор Dim использует, например, модификатор Static
.
Код
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Комментарии
В предыдущем примере переменная applesSold
продолжает существовать после возвращения процедуры runningTotal
в вызывающий код. При следующем вызове runningTotal
applesSold
сохраняет ранее вычисленное значение.
Если бы applesSold
было объявлено без использования Static
, предыдущие накопленные значения не сохранялись бы между вызовами runningTotal
. При следующем вызове runningTotal
applesSold
было бы создано и инициализировано до 0, а runningTotal
просто вернуло бы то же значение, с которым его вызвали.
Компиляция кода
Вы можете инициализировать значение статической локальной переменной в рамках его объявления. Если вы объявляете массив Static
, можно инициализировать его ранг (число измерений), длину каждого измерения и значения отдельных элементов.
Безопасность
В предыдущем примере можно создать то же время существования, объявляя applesSold
на уровне модуля. Если вы изменили область переменной таким образом, процедура больше не будет иметь монопольного доступа к ней. Поскольку другие процедуры могут получить доступ к applesSold
и изменить его значение, текущая сумма может быть ненадежной, а код сложным для поддержания.