Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область объявленного элемента — это набор всего кода, который может ссылаться на него без указания его имени или делая его доступным с помощью инструкции 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
определяется блоком между If
и End If
, и вы не сможете обращаться к cube
, когда выполнение выйдет из блока.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Замечание
Даже если область переменной ограничена блоком, её время существования всё равно соответствует пределам всей процедуры. Если ввести блок несколько раз во время процедуры, каждая переменная блока сохраняет свое предыдущее значение. Чтобы избежать непредвиденных результатов в таком случае, рекомендуется инициализировать переменные блока в начале блока.
Область процедуры
Элемент, объявленный в процедуре, недоступен за пределами этой процедуры. Только процедура, содержащая объявление, может его использовать. Переменные на этом уровне также называются локальными переменными. Вы объявляете их с помощью инструкции Dim с ключевым словом Static или без нее.
Процедура и область видимости блока тесно взаимосвязаны. Если вы объявляете переменную внутри процедуры, но за пределами любого блока в этой процедуре, вы можете рассматривать переменную как область блокировки, где блок является всей процедурой.
Замечание
Все локальные элементы, даже если они являются Static
переменными, являются закрытыми для процедуры, в которой они отображаются. Нельзя объявлять любой элемент с помощью ключевого слова Public в процедуре.
Область модуля
Для удобства, единый термин уровень модуля применяется одинаково к модулям, классам и структурам. Вы можете объявлять элементы на этом уровне, размещая инструкцию объявления вне любой процедуры или блока, но в пределах модуля, класса или структуры.
При объявлении на уровне модуля выбранный вами уровень доступа определяет область действия. Пространство имен, содержащее модуль, класс или структуру, также влияет на область.
Элементы, для которых объявляется уровень закрытого доступа, доступны для каждой процедуры в этом модуле, но не для кода в другом модуле. Инструкция 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
переменные.
Минимизация охвата
Как правило, при объявлении любой переменной или константы в программировании рекомендуется делать область видимости максимально узкой (область блока является самой узкой). Это помогает сохранить память и свести к минимуму вероятность ошибочного обращения к неправильной переменной. Аналогичным образом следует объявить переменную статической только в том случае, если необходимо сохранить его значение между вызовами процедур.