Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O escopo de um elemento declarado é o conjunto de todos os códigos que podem se referir a ele sem qualificar seu nome ou disponibilizá-lo por meio de uma Instrução Imports (tipo e namespace .NET). Um elemento pode ter escopo em um dos seguintes níveis:
Nível | Descrição |
---|---|
Escopo de bloco | Disponível somente no bloco de código no qual ele é declarado |
Escopo do procedimento | Disponível para todo código dentro do procedimento no qual ele é declarado |
Escopo do módulo | Disponível para todo o código dentro do módulo, classe ou estrutura na qual ele é declarado |
Escopo do namespace | Disponível para todo o código no namespace no qual ele é declarado |
Esses níveis de escopo progridem do mais estreito (bloco) para o mais largo (namespace), onde o escopo mais estreito significa o menor conjunto de código que pode fazer referência ao elemento sem qualificação. Para obter mais informações, consulte "Níveis de Escopo" nesta página.
Especificando escopo e definindo variáveis
Especifique o escopo de um elemento ao declará-lo. O escopo pode depender dos seguintes fatores:
A região (bloco, procedimento, módulo, classe ou estrutura) na qual você declara o elemento
O namespace que contém a declaração do elemento
O nível de acesso que você declara para o elemento
Use cuidado ao definir variáveis com o mesmo nome, mas escopo diferente, pois isso pode levar a resultados inesperados. Para obter mais informações, consulte Referências a Elementos Declarados.
Níveis de escopo
Um elemento de programação está disponível em toda a região em que você o declara. Todo o código na mesma região pode se referir ao elemento sem qualificar seu nome.
Escopo de bloco
Um bloco é um conjunto de instruções entre instruções que iniciam e encerram instruções de declaração, como as seguintes:
Do
eLoop
For
[Each
] eNext
If
eEnd If
Select
eEnd Select
SyncLock
eEnd SyncLock
Try
eEnd Try
While
eEnd While
With
eEnd With
Se você declarar uma variável dentro de um bloco, poderá usá-la somente dentro desse bloco. No exemplo a seguir, o escopo da variável cube
do tipo inteiro é o bloco entre If
e End If
, e você não pode mais se referir a cube
quando a execução passa para fora do bloco.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Observação
Mesmo que o escopo de uma variável esteja limitado a um bloco, seu tempo de vida ainda será o de todo o procedimento. Se você inserir o bloco mais de uma vez durante o procedimento, cada variável de bloco manterá seu valor anterior. Para evitar resultados inesperados nesse caso, é sábio inicializar variáveis de bloco no início do bloco.
Escopo do procedimento
Um elemento declarado dentro de um procedimento não está disponível fora desse procedimento. Somente o procedimento que contém a declaração pode usá-la. Variáveis nesse nível também são conhecidas como variáveis locais. Você as declara com a Instrução Dim, com ou sem a palavra-chave Estática.
O procedimento e o escopo do bloco estão intimamente relacionados. Se você declarar uma variável dentro de um procedimento, mas fora de qualquer bloco dentro desse procedimento, poderá considerar a variável como tendo escopo de bloco, em que o bloco é todo o procedimento.
Observação
Todos os elementos locais, mesmo que sejam Static
variáveis, são particulares ao procedimento no qual aparecem. Você não pode declarar nenhum elemento usando a palavra-chave Pública em um procedimento.
Escopo do módulo
Para conveniência, o termo único nível de módulo se aplica igualmente a módulos, classes e estruturas. 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, classe ou estrutura.
Quando você faz uma declaração no nível do módulo, o nível de acesso escolhido determina o escopo. O namespace que contém o módulo, a classe ou a estrutura também afeta o escopo.
Os elementos para os quais você declara o nível de acesso privado estão disponíveis para todos os procedimentos desse módulo, mas não para nenhum código em um módulo diferente. A instrução Dim
no nível do módulo define como padrão Private
no caso de você não usar palavras-chave de nível de acesso. No entanto, você pode tornar o escopo e o nível de acesso mais óbvios usando a Private
palavra-chave na Dim
instrução.
No exemplo a seguir, todos os procedimentos definidos no módulo podem se referir à variável de cadeia de caracteres strMsg
. Quando o segundo procedimento é chamado, ele exibe o conteúdo da variável strMsg
de cadeia de caracteres em uma caixa de diálogo.
' 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 namespace
Se você declarar um elemento no nível do módulo usando a palavra-chave Amigo ou Público , ele ficará disponível para todos os procedimentos em todo o namespace no qual o elemento é declarado. Com a seguinte alteração no exemplo anterior, a variável strMsg
de cadeia de caracteres pode ser referenciada por código em qualquer lugar no namespace de sua declaração.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
O escopo do namespace inclui namespaces aninhados. Um elemento disponível de dentro de um namespace também está disponível em qualquer namespace aninhado dentro desse namespace.
Se o projeto não contiver nenhuma Declaração de Namespace, tudo no projeto estará no mesmo namespace. Nesse caso, o escopo do namespace pode ser considerado como escopo do projeto. Public
elementos em um módulo, classe ou estrutura também estão disponíveis para qualquer projeto que faça referência ao projeto.
Escolha do escopo
Ao declarar uma variável, você deve ter em mente os seguintes pontos ao escolher seu escopo.
Vantagens das variáveis locais
As variáveis locais são uma boa opção para qualquer tipo de cálculo temporário, pelos seguintes motivos:
Evitar conflitos de nomes. Nomes de variáveis locais não são suscetíveis a conflitos. Por exemplo, você pode criar vários procedimentos diferentes que contêm uma variável chamada
intTemp
. Desde que cadaintTemp
um seja declarado como uma variável local, cada procedimento reconhece apenas sua própria versão deintTemp
. Qualquer procedimento pode alterar o valor em seu localintTemp
sem afetarintTemp
variáveis em outros procedimentos.Consumo de memória. As variáveis locais consomem memória somente enquanto o procedimento está em execução. Sua memória é liberada quando o procedimento retorna ao código de chamada. Por outro lado, variáveis compartilhadas e estáticas consomem recursos de memória até que seu aplicativo pare de ser executado, portanto, use-os somente quando necessário. As variáveis de instância consomem memória enquanto sua instância continua a existir, o que as torna menos eficientes do que as variáveis locais, mas potencialmente mais eficientes do que
Shared
ouStatic
variáveis.
Minimizando escopo
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). Isso ajuda a conservar a memória e minimiza as chances de seu código se referir erroneamente à variável errada. Da mesma forma, você deve declarar uma variável como estática somente quando for necessário preservar seu valor entre chamadas de procedimento.