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

Областью видимости объявленного элемента является набор всего кода, который может ссылаться на него без уточнения его имени или предоставления доступа с помощью оператора Imports (пространство имен .NET и тип).The scope of a declared element is the set of all code that can refer to it without qualifying its name or making it available through an Imports Statement (.NET Namespace and Type). Элемент может иметь область действия на одном из следующих уровней:An element can have scope at one of the following levels:

LevelLevel ОписаниеDescription
Область действия блокаBlock scope Доступно только в блоке кода, в котором он объявленAvailable only within the code block in which it is declared
Область действия процедурыProcedure scope Доступен для всего кода в процедуре, в которой он объявленAvailable to all code within the procedure in which it is declared
Область модуляModule scope Доступен для всего кода в модуле, классе или структуре, в которой он объявленAvailable to all code within the module, class, or structure in which it is declared
Область пространства именNamespace scope Доступен для всего кода в пространстве имен, в котором оно объявленоAvailable to all code in the namespace in which it is declared

Эти уровни области выполняются от самого узкого (блока) до самого широкого (пространства имен), где самая узкие области означает наименьший набор кода, который может ссылаться на элемент без квалификации.These levels of scope progress from the narrowest (block) to the widest (namespace), where narrowest scope means the smallest set of code that can refer to the element without qualification. Дополнительные сведения см. в разделе уровни области на этой странице.For more information, see "Levels of Scope" on this page.

Указание области и определение переменныхSpecifying Scope and Defining Variables

Вы указываете область элемента при его объявлении.You specify the scope of an element when you declare it. Область может зависеть от следующих факторов:The scope can depend on the following factors:

  • Область (блок, процедура, модуль, класс или структура), в которой объявляется элементThe region (block, procedure, module, class, or structure) in which you declare the element

  • Пространство имен, содержащее объявление элементаThe namespace containing the element's declaration

  • Уровень доступа, объявленный для элементаThe access level you declare for the element

Используйте осторожность при определении переменных с одинаковым именем, но с разными областями, так как это может привести к непредвиденным результатам.Use care when you define variables with the same name but different scope, because doing so can lead to unexpected results. Для получения дополнительной информации см. References to Declared Elements.For more information, see References to Declared Elements.

Уровни областиLevels of Scope

Программный элемент доступен по всему региону, в котором он объявлен.A programming element is available throughout the region in which you declare it. Весь код в одном регионе может ссылаться на элемент без уточнения его имени.All code in the same region can refer to the element without qualifying its name.

Область блокаBlock Scope

Блок — это набор инструкций, заключенных в операторы инициирования и завершения объявления, как показано ниже:A block is a set of statements enclosed within initiating and terminating declaration statements, such as the following:

  • Do и LoopDo and Loop

  • For[ Each ] иNextFor [Each] and Next

  • If и End IfIf and End If

  • Select и End SelectSelect and End Select

  • SyncLock и End SyncLockSyncLock and End SyncLock

  • Try и End TryTry and End Try

  • While и End WhileWhile and End While

  • With и End WithWith and End With

Если переменная объявлена в блоке, ее можно использовать только в пределах этого блока.If you declare a variable within a block, you can use it only within that block. В следующем примере областью целочисленной переменной cube является блок между If и End If , и вы больше не можете ссылаться на то, cube когда выполнение передается из блока.In the following example, the scope of the integer variable cube is the block between If and End If, and you can no longer refer to cube when execution passes out of the block.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

Примечание

Даже если область действия переменной ограничена блоком, ее время существования все равно будет содержаться во всей процедуре.Even if the scope of a variable is limited to a block, its lifetime is still that of the entire procedure. Если вы вводите блок несколько раз во время процедуры, каждая переменная блока удерживает свое предыдущее значение.If you enter the block more than once during the procedure, each block variable retains its previous value. Чтобы избежать непредвиденных результатов в таком случае, разумно инициализировать блочные переменные в начале блока.To avoid unexpected results in such a case, it is wise to initialize block variables at the beginning of the block.

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

Элемент, объявленный внутри процедуры, недоступен за пределами этой процедуры.An element declared within a procedure is not available outside that procedure. Только процедура, содержащая объявление, может использовать его.Only the procedure that contains the declaration can use it. Переменные на этом уровне также называются локальными переменными.Variables at this level are also known as local variables. Они объявляются с помощью оператора Dimс ключевым словом static или без него.You declare them with the Dim Statement, with or without the Static keyword.

Область действия процедуры и блока тесно связана.Procedure and block scope are closely related. При объявлении переменной внутри процедуры, но вне любого блока внутри этой процедуры можно считать, что переменная имеет область видимости блока, где блоком является вся процедура.If you declare a variable inside a procedure but outside any block within that procedure, you can think of the variable as having block scope, where the block is the entire procedure.

Примечание

Все локальные элементы, даже если они являются Static переменными, являются частными для процедуры, в которой они отображаются.All local elements, even if they are Static variables, are private to the procedure in which they appear. Нельзя объявить какой-либо элемент с помощью ключевого слова Public в процедуре.You cannot declare any element using the Public keyword within a procedure.

Область модуляModule Scope

Для удобства уровень модуля единого термина применяется в равной степени к модулям, классам и структурам.For convenience, the single term module level applies equally to modules, classes, and structures. Вы можете объявить элементы на этом уровне, поместив оператор объявления за пределы любой процедуры или блока, но внутри модуля, класса или структуры.You can declare elements at this level by placing the declaration statement outside of any procedure or block but within the module, class, or structure.

При создании объявления на уровне модуля этот уровень доступа определяет область.When you make a declaration at the module level, the access level you choose determines the scope. Пространство имен, содержащее модуль, класс или структуру, также влияет на область.The namespace that contains the module, class, or structure also affects the scope.

Элементы, для которых объявлен частный уровень доступа, доступны для каждой процедуры в этом модуле, но не для кода в другом модуле.Elements for which you declare Private access level are available to every procedure in that module, but not to any code in a different module. DimИнструкция на уровне модуля по умолчанию принимает значение, Private если не используются ключевые слова уровня доступа.The Dim statement at module level defaults to Private if you do not use any access level keywords. Тем не менее можно сделать область и уровень доступа более очевидными с помощью Private ключевого слова в Dim инструкции.However, you can make the scope and access level more obvious by using the Private keyword in the Dim statement.

В следующем примере все процедуры, определенные в модуле, могут ссылаться на строковую переменную strMsg .In the following example, all procedures defined in the module can refer to the string variable strMsg. При вызове второй процедуры она отображает содержимое строковой переменной strMsg в диалоговом окне.When the second procedure is called, it displays the contents of the string variable strMsg in a dialog box.

' 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

Область пространства именNamespace Scope

Если элемент объявляется на уровне модуля с помощью ключевого слова Friend или Public , он становится доступным для всех процедур в пространстве имен, в котором объявлен элемент.If you declare an element at module level using the Friend or Public keyword, it becomes available to all procedures throughout the namespace in which the element is declared. После выполнения следующей изменения в предыдущем примере строковая переменная strMsg может называться кодом в любом месте пространства имен его объявления.With the following alteration to the preceding example, the string variable strMsg can be referred to by code anywhere in the namespace of its declaration.

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

Область пространства имен включает вложенные пространства имен.Namespace scope includes nested namespaces. Элемент, доступный из пространства имен, также доступен из любого пространства имен, вложенного в это пространство имен.An element available from within a namespace is also available from within any namespace nested inside that namespace.

Если проект не содержит операторов пространства имен, все в проекте находится в том же пространстве имен.If your project does not contain any Namespace Statements, everything in the project is in the same namespace. В этом случае область пространства имен может рассматриваться как область проекта.In this case, namespace scope can be thought of as project scope. Publicэлементы в модуле, классе или структуре также доступны для любого проекта, который ссылается на свой проект.Public elements in a module, class, or structure are also available to any project that references their project.

Выбора областиChoice of Scope

При определении переменной следует учитывать следующие моменты при выборе ее области действия.When you declare a variable, you should keep in mind the following points when choosing its scope.

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

Локальные переменные являются хорошим выбором для любого временного вычисления по следующим причинам.Local variables are a good choice for any kind of temporary calculation, for the following reasons:

  • Конфликт имен — избежать.Name Conflict Avoidance. Имена локальных переменных не подвержены конфликтам.Local variable names are not susceptible to conflict. Например, можно создать несколько различных процедур, содержащих переменную с именем intTemp .For example, you can create several different procedures containing a variable called intTemp. Если каждая из них intTemp объявлена как локальная переменная, каждая процедура распознает только собственную версию intTemp .As long as each intTemp is declared as a local variable, each procedure recognizes only its own version of intTemp. Любая процедура может изменить значение в локальной переменной, intTemp не влияя на intTemp переменные в других процедурах.Any one procedure can alter the value in its local intTemp without affecting intTemp variables in other procedures.

  • Потребление памяти.Memory Consumption. Локальные переменные потребляют память только во время выполнения процедуры.Local variables consume memory only while their procedure is running. Их память освобождается, когда процедура возвращается в вызывающий код.Their memory is released when the procedure returns to the calling code. В отличие от этого, Общие и статические переменные потребляют ресурсы памяти до тех пор, пока приложение не прекратит работу, поэтому используйте их только при необходимости.By contrast, Shared and Static variables consume memory resources until your application stops running, so use them only when necessary. Переменные экземпляра потребляют память, пока их экземпляры продолжают существовать, что делает их менее эффективными, чем локальные переменные, но потенциально более эффективными, чем Shared Static переменные.Instance variables consume memory while their instance continues to exist, which makes them less efficient than local variables, but potentially more efficient than Shared or Static variables.

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

Как правило, при объявлении любой переменной или константы рекомендуется сделать область как можно более узким (область блока является самой узким).In general, when declaring any variable or constant, it is good programming practice to make the scope as narrow as possible (block scope is the narrowest). Это помогает экономить память и минимизирует вероятность того, что код ошибочно ссылался на неверную переменную.This helps conserve memory and minimizes the chances of your code erroneously referring to the wrong variable. Аналогично, следует объявить переменную как статическую , только если необходимо сохранить ее значение между вызовами процедур.Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

См. также разделSee also