Поделиться через


Время существования в Visual Basic

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

Различные сроки существования

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

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

Начало времени существования

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

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

Переменные, объявленные в блоке и находящегося внутри процедуры (например в цикле For), инициализируются при входе в процедуру.Это происходит вне зависимости от того, выполняется этот блок в конечном итоге или нет.

Окончание времени существования

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

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

Продление срока существования

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

Расположение процедуры и совместное использование

Начинается время существования статической переменной

Заканчивается время существования статической переменной

В модуле (общем по умолчанию)

При первом вызове процедуры

При остановке выполнения приложения

В классе, Shared (процедура не является элементом экземпляра)

Первый раз процедура вызывается определенным экземпляром или именем самого класса или структуры

При остановке выполнения приложения

В экземпляре класса, не Shared (процедура является элементом экземпляра)

При первом вызове процедуры для определенного экземпляра

Когда экземпляр освобождается для сборки мусора

Статические переменные с одинаковыми именами

Статические переменные с одним и тем же именем можно объявлять в нескольких процедурах.В этом случае компилятор Visual Basic воспринимает каждую из таких переменных как отдельный элемент.Инициализация одной из этих переменных не влияет на значения остальных.То же справедливо и при определении процедуры с набором перегрузок и объявлении статической переменной с тем же именем в каждой перегрузке.

Содержание элементов для статических переменных

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

Пример

35styb3a.collapse_all(ru-ru,VS.110).gifОписание

В приведенном ниже примере объявляется переменная с использованием ключевого слова Static (Visual Basic).(Обратите внимание, что ключевое слово Dim не требуется, если в Оператор Dim (Visual Basic) используется модификатор, например Static.)

35styb3a.collapse_all(ru-ru,VS.110).gifКод

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

35styb3a.collapse_all(ru-ru,VS.110).gifКомментарии

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

Если applesSold была объявлена без использования ключевого слова Static, то ранее накопленные значения не сохранятся при последующих вызовах runningTotal.При последующих вызовах runningTotal переменная applesSold создавалась бы заново, принимая значение 0, и runningTotal просто возвращала бы то же значение, с которым была вызвана.

35styb3a.collapse_all(ru-ru,VS.110).gifКомпиляция кода

Значение статической локальной переменной можно инициализировать при ее объявлении.Если массив объявляется как Static, можно инициализировать его размерность (число измерений), длину по каждому из измерений и значения отдельных элементов.

35styb3a.collapse_all(ru-ru,VS.110).gifБезопасность

В предыдущем примере можно создать тот же срок существования путем объявления applesSold на уровне модуля.Однако, если таким образом изменить область действия переменной, процедура уже не будет иметь к ней исключительный доступ.Поскольку другие процедуры смогут получить доступ к переменной applesSold и изменить ее значение, значения с накоплением окажутся ненадежными, а код более сложным в обслуживании.

См. также

Задачи

Устранение неполадок, связанных с типами данных (Visual Basic)

Ссылки

Shared (Visual Basic)

Nothing (Visual Basic)

Static (Visual Basic)

Основные понятия

Имена объявленных типов (Visual Basic)

Ссылки на объявленные элементы (Visual Basic)

Область видимости в Visual Basic

Уровни доступа в Visual Basic

Переменные в Visual Basic

Объявление переменной в Visual Basic