Escopo no Visual BasicScope in Visual Basic

O escopo de um elemento declarado é o conjunto de todo o código que pode fazer referência a ele sem qualificar seu nome ou disponibilizá-lo por meio de uma instrução Imports (namespace e tipo do .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). Um elemento pode ter um escopo em um dos seguintes níveis:An element can have scope at one of the following levels:

NívelLevel DescriçãoDescription
Escopo de blocoBlock scope Disponível somente dentro do bloco de código no qual ele é declaradoAvailable only within the code block in which it is declared
Escopo do procedimentoProcedure scope Disponível para todo o código dentro do procedimento no qual ele é declaradoAvailable to all code within the procedure in which it is declared
Escopo do móduloModule scope Disponível para todo o código dentro do módulo, da classe ou da estrutura na qual ele é declaradoAvailable to all code within the module, class, or structure in which it is declared
Escopo do namespaceNamespace scope Disponível para todo o código no namespace no qual ele é declaradoAvailable to all code in the namespace in which it is declared

Esses níveis de progresso do escopo do mais estreito (bloco) para o mais largo (namespace), em que o escopo mais estreito significa o menor conjunto de código que pode se referir ao elemento sem qualificação.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. Para obter mais informações, consulte "níveis de escopo" nesta página.For more information, see "Levels of Scope" on this page.

Especificando o escopo e Definindo variáveisSpecifying Scope and Defining Variables

Você especifica o escopo de um elemento ao declará-lo.You specify the scope of an element when you declare it. O escopo pode depender dos seguintes fatores:The scope can depend on the following factors:

  • A região (bloco, procedimento, módulo, classe ou estrutura) na qual você declara o elementoThe region (block, procedure, module, class, or structure) in which you declare the element

  • O namespace que contém a declaração do elementoThe namespace containing the element's declaration

  • O nível de acesso que você declara para o elementoThe access level you declare for the element

Tenha cuidado ao definir variáveis com o mesmo nome, mas com escopo diferente, porque isso pode levar a resultados inesperados.Use care when you define variables with the same name but different scope, because doing so can lead to unexpected results. Para obter mais informações, consulte referências a elementos declarados.For more information, see References to Declared Elements.

Níveis de escopoLevels of Scope

Um elemento de programação está disponível em toda a região em que você o declara.A programming element is available throughout the region in which you declare it. Todo o código na mesma região pode se referir ao elemento sem qualificar seu nome.All code in the same region can refer to the element without qualifying its name.

Escopo do blocoBlock Scope

Um bloco é um conjunto de instruções incluídas em instruções de declaração de início e término, como a seguinte:A block is a set of statements enclosed within initiating and terminating declaration statements, such as the following:

  • Do e LoopDo and Loop

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

  • If e End IfIf and End If

  • Select e End SelectSelect and End Select

  • SyncLock e End SyncLockSyncLock and End SyncLock

  • Try e End TryTry and End Try

  • While e End WhileWhile and End While

  • With e End WithWith and End With

Se você declarar uma variável em um bloco, poderá usá-la somente dentro desse bloco.If you declare a variable within a block, you can use it only within that block. No exemplo a seguir, o escopo da variável de inteiro cube é o bloco entre If e End If , e você não pode mais se referir cube quando a execução passa para fora do bloco.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

Observação

Mesmo que o escopo de uma variável seja limitado a um bloco, seu tempo de vida ainda é o de todo o procedimento.Even if the scope of a variable is limited to a block, its lifetime is still that of the entire procedure. Se você inserir o bloco mais de uma vez durante o procedimento, cada variável de bloco manterá seu valor anterior.If you enter the block more than once during the procedure, each block variable retains its previous value. Para evitar resultados inesperados nesse caso, é recomendável inicializar variáveis de bloco no início do bloco.To avoid unexpected results in such a case, it is wise to initialize block variables at the beginning of the block.

Escopo do procedimentoProcedure Scope

Um elemento declarado em um procedimento não está disponível fora desse procedimento.An element declared within a procedure is not available outside that procedure. Somente o procedimento que contém a declaração pode usá-lo.Only the procedure that contains the declaration can use it. As variáveis nesse nível também são conhecidas como variáveis locais.Variables at this level are also known as local variables. Você os declara com a instrução Dim, com ou sem a palavra-chave static .You declare them with the Dim Statement, with or without the Static keyword.

O procedimento e o escopo do bloco estão fortemente relacionados.Procedure and block scope are closely related. Se você declarar uma variável dentro de um procedimento, mas fora de qualquer bloco dentro desse procedimento, você pode considerar a variável como tendo o escopo de bloco, onde o bloco é o procedimento inteiro.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.

Observação

Todos os elementos locais, mesmo que sejam Static variáveis, são privados para o procedimento no qual aparecem.All local elements, even if they are Static variables, are private to the procedure in which they appear. Você não pode declarar nenhum elemento usando a palavra-chave Public em um procedimento.You cannot declare any element using the Public keyword within a procedure.

Escopo do móduloModule Scope

Para sua conveniência, o nível de módulo de termo único aplica-se igualmente a módulos, classes e estruturas.For convenience, the single term module level applies equally to modules, classes, and structures. Você pode declarar elementos nesse nível colocando a instrução de declaração fora de qualquer procedimento ou bloco, mas dentro do módulo, da classe ou da estrutura.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.

Quando você faz uma declaração no nível do módulo, o nível de acesso que você escolhe determina o escopo.When you make a declaration at the module level, the access level you choose determines the scope. O namespace que contém o módulo, a classe ou a estrutura também afeta o escopo.The namespace that contains the module, class, or structure also affects the scope.

Os elementos para os quais você declara o nível de acesso privado estão disponíveis para cada procedimento nesse módulo, mas não para qualquer código em um módulo diferente.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. A Dim instrução no nível do módulo será padronizada Private se você não usar nenhuma palavra-chave de nível de acesso.The Dim statement at module level defaults to Private if you do not use any access level keywords. No entanto, você pode tornar o nível de escopo e de acesso mais óbvio usando a Private palavra-chave na Dim instrução.However, you can make the scope and access level more obvious by using the Private keyword in the Dim statement.

No exemplo a seguir, todos os procedimentos definidos no módulo podem se referir à variável de cadeia de caracteres strMsg .In the following example, all procedures defined in the module can refer to the string variable strMsg. Quando o segundo procedimento é chamado, ele exibe o conteúdo da variável de cadeia de caracteres strMsg em uma caixa de diálogo.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

Escopo do namespaceNamespace Scope

Se você declarar um elemento no nível do módulo usando a palavra-chave Friend ou Public , ele ficará disponível para todos os procedimentos em todo o namespace no qual o elemento é declarado.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. Com a seguinte alteração no exemplo anterior, a variável de cadeia de caracteres strMsg pode ser referenciada pelo código em qualquer lugar no namespace de sua declaração.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

O escopo do namespace inclui namespaces aninhados.Namespace scope includes nested namespaces. Um elemento disponível de dentro de um namespace também está disponível de dentro de qualquer namespace aninhado dentro desse namespace.An element available from within a namespace is also available from within any namespace nested inside that namespace.

Se o seu projeto não contiver nenhuma instrução de namespaces, tudo no projeto estará no mesmo namespace.If your project does not contain any Namespace Statements, everything in the project is in the same namespace. Nesse caso, o escopo do namespace pode ser considerado como escopo do projeto.In this case, namespace scope can be thought of as project scope. Public os elementos em um módulo, classe ou estrutura também estão disponíveis para qualquer projeto que faça referência a seu projeto.Public elements in a module, class, or structure are also available to any project that references their project.

Escolha do escopoChoice of Scope

Ao declarar uma variável, você deve ter em mente os seguintes pontos ao escolher seu escopo.When you declare a variable, you should keep in mind the following points when choosing its scope.

Vantagens das variáveis locaisAdvantages of Local Variables

As variáveis locais são uma boa opção para qualquer tipo de cálculo temporário, pelos seguintes motivos:Local variables are a good choice for any kind of temporary calculation, for the following reasons:

  • Prevenção de conflito de nomes.Name Conflict Avoidance. Nomes de variáveis locais não são suscetíveis a conflitos.Local variable names are not susceptible to conflict. Por exemplo, você pode criar vários procedimentos diferentes contendo uma variável chamada intTemp .For example, you can create several different procedures containing a variable called intTemp. Desde que cada intTemp um seja declarado como uma variável local, cada procedimento reconhece apenas sua própria versão do intTemp .As long as each intTemp is declared as a local variable, each procedure recognizes only its own version of intTemp. Qualquer procedimento pode alterar o valor em seu local intTemp sem afetar as intTemp variáveis em outros procedimentos.Any one procedure can alter the value in its local intTemp without affecting intTemp variables in other procedures.

  • Consumo de memória.Memory Consumption. As variáveis locais consomem memória somente enquanto o procedimento está em execução.Local variables consume memory only while their procedure is running. Sua memória é liberada quando o procedimento retorna ao código de chamada.Their memory is released when the procedure returns to the calling code. Por outro lado, variáveis compartilhadas e estáticas consomem recursos de memória até que seu aplicativo pare de funcionar, portanto, use-os somente quando necessário.By contrast, Shared and Static variables consume memory resources until your application stops running, so use them only when necessary. As variáveis de instância consomem memória enquanto sua instância continua a existir, o que as torna menos eficiente do que as variáveis locais, mas potencialmente mais eficientes do que Shared ou Static variáveis.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.

Minimizando o escopoMinimizing Scope

Em geral, ao declarar qualquer variável ou constante, é uma boa prática de programação tornar o escopo o mais estreito possível (o escopo do bloco é o mais estreito).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). Isso ajuda a conservar a memória e minimiza as chances de seu código se referir erroneamente à variável errada.This helps conserve memory and minimizes the chances of your code erroneously referring to the wrong variable. Da mesma forma, você deve declarar uma variável para ser estática somente quando for necessário preservar seu valor entre chamadas de procedimento.Similarly, you should declare a variable to be Static only when it is necessary to preserve its value between procedure calls.

Consulte tambémSee also