Область видимости в Visual Basic
Область объявленного элемента — это набор всего кода, который может ссылаться на него, не указав его имя или сделав его доступным через оператор Import (пространство имен и тип.NET). Элемент может иметь область на одном из следующих уровней:
Level | Description |
---|---|
Область действия блока | Доступно только в блоке кода, в котором он объявлен |
Процедура область | Доступен для всех кодов в процедуре, в которой она объявлена |
Модуль область | Доступен для всех кодов в модуле, классе или структуре, в которой она объявлена |
Пространство имен область | Доступен для всех кодов в пространстве имен, в котором он объявлен |
Эти уровни область прогресса от самого узкого (блока) до самого широкого (пространства имен), где самый узкий область означает наименьший набор кода, который может ссылаться на элемент без квалификации. Дополнительные сведения см. на этой странице в разделе "Уровни области".
Указание области и определение переменных
При объявлении элемента указывается область элемента. Область может зависеть от следующих факторов:
Область (блок, процедура, модуль, класс или структура), в которой объявляется элемент
Пространство имен, содержащее объявление элемента
Уровень доступа, объявленный для элемента
Используйте осторожность при определении переменных с одинаковым именем, но разными область, так как это может привести к непредвиденным результатам. Для получения дополнительной информации см. References to Declared Elements.
Уровни области
Элемент программирования доступен во всем регионе, в котором вы объявляете его. Весь код в одном регионе может ссылаться на элемент без указания его имени.
Область блокировки
Блок — это набор операторов, заключенных в операторы инициации и прекращения объявления, например следующие:
Do
иLoop
.For
[Each
] иNext
If
иEnd If
Select
иEnd Select
SyncLock
иEnd SyncLock
Try
иEnd Try
While
иEnd While
With
иEnd With
Если вы объявляете переменную в блоке, ее можно использовать только в этом блоке. В следующем примере область целочисленной переменной cube
является блоком между If
и End If
, и вы больше не можете ссылаться на cube
то, когда выполнение передается из блока.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Примечание.
Даже если область переменной ограничен блоком, его время существования по-прежнему остается целым процессом. Если ввести блок несколько раз во время процедуры, каждая переменная блока сохраняет свое предыдущее значение. Чтобы избежать непредвиденных результатов в таком случае, рекомендуется инициализировать переменные блока в начале блока.
Область процедуры
Элемент, объявленный в процедуре, недоступен за пределами этой процедуры. Можно использовать только процедуру, содержащую объявление. Переменные на этом уровне также называются локальными переменными. Вы объявляете их с помощью инструкции Dim с статическим ключевое слово или без нее.
Процедуры и блок область тесно связаны. Если вы объявляете переменную внутри процедуры, но за пределами любого блока в этой процедуре, можно подумать об переменной как блоке область, где блок является всей процедурой.
Примечание.
Все локальные элементы, даже если они являются Static
переменными, являются закрытыми для процедуры, в которой они отображаются. Нельзя объявлять любой элемент с помощью общедоступного ключевое слово в процедуре.
Область модуля
Для удобства уровень единого термина применяется одинаково к модулям, классам и структурам. Вы можете объявить элементы на этом уровне, разместив инструкцию объявления вне любой процедуры или блока, но в модуле, классе или структуре.
При объявлении на уровне модуля уровень доступа, который вы выбираете, определяет область. Пространство имен, содержащее модуль, класс или структуру, также влияет на область.
Элементы, для которых объявляется уровень закрытого доступа, доступны для каждой процедуры в этом модуле, но не для кода в другом модуле. Инструкция 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 или Public, он становится доступным для всех процедур в пространстве имен, в котором объявлен элемент. При следующем изменении в предыдущем примере строковая переменная strMsg
может ссылаться на код в любом месте пространства имен объявления.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
Пространство имен область включает вложенные пространства имен. Элемент, доступный в пространстве имен, также доступен из любого пространства имен, вложенного в это пространство имен.
Если проект не содержит инструкциипространства имен, все в проекте находится в одном пространстве имен. В этом случае пространство имен область можно рассматривать как область проекта. Public
элементы в модуле, классе или структуре также доступны для любого проекта, ссылающегося на свой проект.
Выбор области
При объявлении переменной следует учитывать следующие моменты при выборе область.
Преимущества локальных переменных
Локальные переменные являются хорошим выбором для любого типа временного вычисления по следующим причинам:
Избегание конфликтов имен. Имена локальных переменных не подвержены конфликту. Например, можно создать несколько различных процедур, содержащих переменную с именем
intTemp
. Если каждая из нихintTemp
объявлена как локальная переменная, каждая процедура распознает только собственную версиюintTemp
. Любая одна процедура может изменить значение в локальнойintTemp
среде, не затрагиваяintTemp
переменные в других процедурах.Потребление памяти. Локальные переменные используют память только во время выполнения процедуры. Их память освобождается, когда процедура возвращается в вызывающий код. В отличие от этого, общие и статические переменные используют ресурсы памяти, пока приложение не перестанет работать, поэтому используйте их только при необходимости. Переменные экземпляра используют память, пока их экземпляр продолжает существовать, что делает их менее эффективными, чем локальные переменные , но потенциально более эффективными, чем
Shared
Static
переменные.
Минимизация области
Как правило, при объявлении любой переменной или константы рекомендуется программирование сделать область максимально узким (блок область является самым узким). Это помогает сохранить память и свести к минимуму вероятность ошибочного обращения к неправильной переменной. Аналогичным образом следует объявить переменную статической только в том случае, если необходимо сохранить его значение между вызовами процедур.