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 (.NET Namespace and Type). Um elemento pode ter escopo em um dos seguintes níveis:
Level
Description
Âmbito do bloco
Disponível apenas dentro do bloco de código em que é declarado
Âmbito do procedimento
Disponível para todos os códigos no âmbito do procedimento em que é declarado
Âmbito do módulo
Disponível para todo o código dentro do módulo, classe ou estrutura em que é 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 amplo (namespace), onde escopo mais estreito significa o menor conjunto de código que pode se referir ao elemento sem qualificação. Para obter mais informações, consulte "Níveis de escopo" nesta página.
Especificando escopo e definindo variáveis
Você especifica o escopo de um elemento ao declará-lo. O âmbito 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
Tenha cuidado ao definir variáveis com o mesmo nome, mas com escopo diferente, porque isso pode levar a resultados inesperados. Para obter mais informações, consulte Referências a elementos declarados.
Níveis de âmbito
Um elemento de programação está disponível em toda a região em que você o declara. Todos os códigos na mesma região podem referir-se ao elemento sem qualificar seu nome.
Escopo do bloco
Um bloco é um conjunto de instruções incluídas nas instruções de declaração inicial e final, como as seguintes:
Do e Loop
For [Each] e Next
If e End If
Select e End Select
SyncLock e End SyncLock
Try e End Try
While e End While
With e End 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 inteira é 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
Nota
Mesmo que o âmbito de uma variável seja limitado a um bloco, o seu tempo de vida continua a 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, é aconselhável inicializar variáveis de bloco no início do bloco.
Âmbito do procedimento
Um elemento declarado no âmbito de um procedimento não está disponível fora desse procedimento. Somente o procedimento que contém a declaração pode usá-lo. As variáveis a este nível são também conhecidas como variáveis locais. Você os declara com a Declaração Dim, com ou sem a palavra-chave Estática .
O procedimento e o âmbito do bloco estão estreitamente relacionados. Se você declarar uma variável dentro de um procedimento, mas fora de qualquer bloco dentro desse procedimento, poderá pensar na variável como tendo escopo de bloco, onde o bloco é o procedimento inteiro.
Nota
Todos os elementos locais, mesmo que sejam Static variáveis, são privados do procedimento em que aparecem. Não é possível declarar qualquer elemento usando a palavra-chave Public dentro de um procedimento.
Âmbito do módulo
Por conveniência, o nível de módulo de termo único aplica-se igualmente a módulos, classes e estruturas. Você pode declarar elementos neste 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 nesse módulo, mas não para qualquer código em um módulo diferente. A Dim instrução no nível do módulo assume como Private padrão se você não usar nenhuma palavra-chave de nível de acesso. No entanto, você pode tornar o escopo e o nível de acesso mais óbvios usando a PrivateDim palavra-chave na instrução.
No exemplo a seguir, todos os procedimentos definidos no módulo podem se referir à variável strMsgstring . Quando o segundo procedimento é chamado, ele exibe o conteúdo da variável strMsg string 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 Friend ou Public , ele ficará disponível para todos os procedimentos em todo o namespace no qual o elemento é declarado. Com a seguinte alteração para o exemplo anterior, a variável strMsg string pode ser referida 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 de dentro de qualquer namespace aninhado dentro desse namespace.
Se o seu projeto não contiver nenhuma instruçãode 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 seu projeto.
Escolha do âmbito de aplicação
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 escolha para qualquer tipo de cálculo temporário, pelas seguintes razões:
Prevenção de conflitos de nomes. Os nomes das variáveis locais não são suscetíveis a conflitos. Por exemplo, você pode criar vários procedimentos diferentes contendo uma variável chamada intTemp. Desde que cada intTemp um seja declarado como uma variável local, cada procedimento reconhece apenas sua própria versão do intTemp. Qualquer procedimento pode alterar o valor em seu local intTemp sem afetar intTemp variáveis em outros procedimentos.
Consumo de memória. As variáveis locais consomem memória apenas enquanto o procedimento está em execução. Sua memória é liberada quando o procedimento retorna ao código de chamada. Por outro lado, as variáveis Compartilhadas e Estáticas consomem recursos de memória até que seu aplicativo pare de ser executado, portanto, use-as 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 as variáveis OR Static .
Minimizando o escopo
Em geral, ao declarar qualquer variável ou constante, é uma boa prática de programação tornar o âmbito o mais estreito possível (o âmbito do bloco é o mais restrito). 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.
A origem deste conteúdo pode ser encontrada no GitHub, onde também pode criar e rever problemas e pedidos Pull. Para mais informações, consulte o nosso guia do contribuidor.
Comentários do .NET
O .NET é um projeto código aberto. Selecione um link para fornecer comentários:
Utilize blocos de código com mais confiança, compreenda como afetam a visibilidade e a acessibilidade de construções de nível superior e inferior no seu código.