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

Обновлен: Ноябрь 2007

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

Уровень

Описание

Область действия блока

Элемент доступен только в пределах блока кода, в котором он объявлен.

Область действия процедуры

Элемент доступен в коде в пределах процедуры, в которой он объявлен.

Область действия модуля

Элемент доступен в коде в пределах модуля, класса или структуры, в которых он объявлен.

Область действия уровня пространства имен

Элемент доступен в коде в пространстве имен, в котором он объявлен.

Области действия выше перечислены от самой узкой (блока) до самой широкой (пространства имен), где самая узкая область действия означает наименьшее множество кода, который может обращаться к элементу без уточнения имени. Дополнительные сведения см. в разделе "Уровни областей действия" на этой странице.

Указание области и определение переменных

Область действия элемента задается при его объявлении. Область действия может зависеть от следующих факторов:

  • Область кода (блок, процедура, модуль, класс или структура), в которой объявляется элемент.

  • Пространство имен, которому принадлежит объявление элемента.

  • Объявленный уровень доступа элемента.

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

Уровни областей действия

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

Область действия уровня блока

Блок представляет собой набор операторов, в начале и в конце которого стоят операторы начала и завершения блока. Примеры:

  • Do и Loop.

  • For [Each] и Next.

  • If и End If.

  • Select и End Select.

  • SyncLock и End SyncLock.

  • Try и End Try.

  • While и End While.

  • With и End With.

Если объявить переменную в блоке, то ее можно использовать только внутри этого блока. В следующем примере область действия переменной cube типа Integer — это блок между операторами If и End If. Ссылаться на переменную cube вне блока нельзя.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If
1t0wsc67.alert_note(ru-ru,VS.90).gifПримечание.

Хотя область действия переменной и ограничена блоком, ее время существования совпадает со временем существования всей процедуры. Если в ходе выполнения процедуры код внутри блока выполняется несколько раз, переменная каждого блока сохраняет свое предыдущее значение. Чтобы избежать непредвиденных результатов, добавляйте операторы инициализации переменных в начале блока.

Область действия уровня процедуры

Элемент, объявленный внутри процедуры, недоступен вне этой процедуры. Его может использовать только процедура, содержащая объявление этого элемента. Переменные на этом уровне, называются локальными переменными. Они объявляются с помощью Оператор Dim (Visual Basic) с ключевым словом Static (Visual Basic) или без него.

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

1t0wsc67.alert_note(ru-ru,VS.90).gifПримечание.

Все локальные элементы, даже если они объявляются как переменные Static, являются закрытыми элементами процедуры, в которой они объявлены. Нельзя объявить элемент с использованием ключевого слова Public (Visual Basic) внутри процедуры.

Область действия уровня модуля

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

При объявлении элемента на уровне модуля его область действия определяется объявленным уровнем доступа. На область действия также влияет пространство имен, которому принадлежит модуль, класс или структура.

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

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

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

Область действия уровня пространства имен

Если элемент объявляется на уровне модуля с ключевым словом Friend (Visual Basic) или Public (Visual Basic), он становится доступным для всех процедур из пространства имен, в котором он объявлен. Учитывая следующие изменения в предыдущем примере, обращаться к строковой переменной strMsg можно из любого места в пространстве имен, в котором она объявлена.

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

Область действия уровня пространства имен включает вложенные пространства имен. Элемент, доступный внутри пространства имен, также доступен и внутри любого пространства имен, вложенного в него.

Если проект не содержит операторов Оператор "Namespace", весь проект считается одним пространством имен. В этом случае область действия пространства имен может рассматриваться как область действия проекта. Элементы Public в модуле, классе или структуре также доступны для любого проекта, который ссылается на соответствующий проект.

Выбор области действия

При объявлении переменной и выборе ее области действия следует иметь в виду следующие моменты.

Преимущества локальных переменных

Локальные переменные являются хорошим выбором для любого типа временных вычислений по следующим причинам:

  • Предотвращение конфликтов имен. Имена локальных переменных исключает возможность конфликта имен. Например, можно создать несколько разных процедур, содержащих переменную с именем intTemp. Поскольку каждая переменная intTemp объявлена как локальная переменная, каждая процедура распознает только свою собственную версию intTemp. Любая процедура может изменить значение собственной локальной переменной intTemp, не затрагивая значений переменных intTemp в других процедурах.

  • Потребление ресурсов памяти. Локальные переменные потребляют память только во время выполнения процедуры. Память, занимаемая ими, высвобождается, когда процедура возвращает управление вызывающему коду. Напротив, переменные Shared (Visual Basic) и Static (Visual Basic) используют ресурсы памяти до тех пор, пока не завершится работа приложения, поэтому следует их использовать только при необходимости. Переменные экземпляра потребляют память, пока их экземпляр продолжает существовать, что делает их менее эффективными, чем локальные переменные, но потенциально более эффективными, чем переменные Shared и Static.

Сокращение области действия

В целом, при объявлении любой переменной или константы считается хорошим стилем программирования сокращать ее область насколько это возможно (самая маленькая область — область блока). Это помогает освободить ресурсы памяти и свести к минимуму вероятность вызова в коде недопустимой переменной. По этой же причине лучше объявлять переменную как статическую (Static (Visual Basic)) только тогда, когда необходимо сохранить ее значение между вызовами процедур.

См. также

Задачи

Практическое руководство. Управление областью действия переменной

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

Характеристики объявленных элементов

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

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

Разрешение ссылки, когда несколько переменных имеют одинаковые имена

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