Время существования в Visual Basic
Время существования объявленного элемента — это период времени, в течение которого он доступен для использования. Переменные являются единственными элементами, имеющими время существования. Для этого компилятор обрабатывает параметры процедуры и функцию в качестве особых случаев переменных. Время существования переменной представляет период времени, в течение которого он может содержать значение. Его значение может измениться в течение всего времени существования, но оно всегда содержит некоторое значение.
Разные сроки существования
Переменная-член (объявленная на уровне модуля вне любой процедуры) обычно имеет то же время существования, что и элемент, в котором он объявлен. Общая переменная, объявленная в классе или структуре, существует в виде отдельной копии для каждого экземпляра класса или структуры, в которой она объявлена. Каждая такая переменная имеет то же время существования, что и его экземпляр. Shared
Однако переменная имеет только одно время существования, которое длится в течение всего времени выполнения приложения.
Локальная переменная (объявленная внутри процедуры) существует только в то время как процедура, в которой она объявлена. Это также относится к параметрам этой процедуры и к любой возвращаемой функции. Однако если эта процедура вызывает другие процедуры, локальные переменные сохраняют свои значения во время выполнения вызываемой процедуры.
Начало существования
Время существования локальной переменной начинается, когда элемент управления вводит процедуру, в которой она объявлена. Каждая локальная переменная инициализирована в значение по умолчанию для его типа данных, как только процедура начнет выполняться. При обнаружении Dim
инструкции, указывающей начальные значения, эти переменные задаются для этих значений, даже если код уже назначил другим значениям.
Каждый элемент переменной структуры инициализирован так, как если бы он был отдельной переменной. Аналогичным образом каждый элемент переменной массива инициализируется по отдельности.
Переменные, объявленные в блоке внутри процедуры (например For
, цикл), инициализированы при входе в процедуру. Эти инициализации вступают в силу, если ваш код когда-либо выполняет блок.
Окончание срока существования
После завершения процедуры значения локальных переменных не сохраняются, а Visual Basic освобождает память. При следующем вызове процедуры все локальные переменные создаются и повторно инициализированы.
Когда экземпляр класса или структуры завершается, его не общие переменные теряют память и их значения. Каждый новый экземпляр класса или структуры создает и повторно инициализирует свои не общие переменные. Однако переменные сохраняются до тех пор, Shared
пока приложение не перестанет работать.
Расширение времени существования
Если объявить локальную переменную с Static
ключевое слово, срок его существования превышает время выполнения процедуры. В следующей таблице показано, как объявление процедуры определяет, сколько времени Static
существует переменная.
Расположение процедуры и общий доступ | Начинается время существования статической переменной | Время существования статических переменных заканчивается |
---|---|---|
В модуле (общий по умолчанию) | При первом вызове процедуры | Когда приложение перестанет работать |
В классе Shared (процедура не является членом экземпляра) |
При первом вызове процедуры в определенном экземпляре или самом имени класса или структуры | Когда приложение перестанет работать |
В экземпляре класса, а не Shared (процедура является членом экземпляра) |
При первом вызове процедуры для конкретного экземпляра | Когда экземпляр освобождается для сборки мусора (GC) |
Статические переменные того же имени
Статические переменные можно объявить с одинаковым именем в нескольких процедурах. При этом компилятор Visual Basic считает каждую такую переменную отдельным элементом. Инициализация одной из этих переменных не влияет на значения других. То же самое применяется, если вы определяете процедуру с набором перегрузок и объявляете статическую переменную с одинаковым именем в каждой перегрузке.
Содержащие элементы для статических переменных
Вы можете объявить статическую локальную переменную в классе, то есть внутри процедуры в этом классе. Однако нельзя объявить статическую локальную переменную в структуре как элемент структуры или как локальную переменную процедуры в этой структуре.
Пример
Description
В следующем примере объявляется переменная со статическим ключевое слово. (Обратите внимание, что вам не нужен 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
к значению и изменить его значение, выполнение общей суммы может быть ненадежным, и код может оказаться более сложным для поддержания.