Область видимости в 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 переменные в других процедурах.

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

Минимизация области

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

См. также