Tempo de vida no Visual Basic
O tempo de vida de um elemento declarado é o período de tempo durante o qual ela está disponível para uso. As variáveis são os únicos elementos que têm tempo de vida. Para essa finalidade, o compilador trata parâmetros de procedimento e a função retorna como casos especiais de variáveis. O tempo de vida de uma variável representa o período de tempo durante o qual ela pode conter um valor. Seu valor pode mudar ao longo de seu tempo de vida, mas sempre contém algum valor.
Vida útil diferente
Uma variável de membro (declarada no nível do módulo, fora de qualquer procedimento) normalmente tem o mesmo tempo de vida que o elemento no qual é declarado. Uma variável não compartilhada declarada em uma classe ou estrutura existe como uma cópia separada para cada instância da classe ou estrutura na qual ela é declarada. Cada variável desse tipo tem o mesmo tempo de vida que sua instância. No entanto, uma variável Shared
tem apenas um único tempo de vida, que dura o tempo inteiro em que seu aplicativo está em execução.
Uma variável local (declarada dentro de um procedimento) existe somente enquanto o procedimento no qual ele é declarado está em execução. Isso também se aplica aos parâmetros desse procedimento e a qualquer retorno de função. No entanto, se esse procedimento chamar outros procedimentos, as variáveis locais manterão seus valores enquanto os procedimentos chamados estiverem em execução.
Início do tempo de vida
O tempo de vida de uma variável local começa quando o controle entra no procedimento no qual ela é declarada. Cada variável local é inicializada para o valor padrão de seu tipo de dados assim que o procedimento começa a ser executado. Quando o procedimento encontra uma instrução Dim
que especifica valores iniciais, ele define essas variáveis para esses valores, mesmo que seu código já tenha atribuído outros valores a eles.
Cada membro de uma estrutura variável é inicializado como se fosse uma variável separada. Da mesma forma, cada elemento de uma variável de matriz é inicializado individualmente.
As variáveis declaradas dentro de um bloco dentro de um procedimento (como um loop For
) são inicializadas na entrada do procedimento. Essas inicializações têm efeito se o código executa ou não o bloco.
Fim do tempo de vida
Quando um procedimento termina, os valores de suas variáveis locais não são preservados e o Visual Basic recupera sua memória. Na próxima vez que você chamar o procedimento, todas as variáveis locais serão criadas de novo e reinicializadas.
Quando uma instância de uma classe ou estrutura termina, suas variáveis não compartilhadas perdem a memória e seus valores. Cada nova instância da classe ou estrutura cria e reinicializa suas variáveis não compartilhadas. No entanto, as variáveis Shared
são preservadas até que seu aplicativo pare de ser executado.
Extensão do tempo de vida
Se você declarar uma variável local com a palavra-chave Static
, seu tempo de vida será maior do que o tempo de execução de seu procedimento. A tabela a seguir mostra como a declaração de procedimento determina por quanto tempo uma variável Static
existe.
Local e compartilhamento do procedimento | O tempo de vida da variável estática começa | O tempo de vida da variável estática termina |
---|---|---|
Em um módulo (compartilhado por padrão) | A primeira vez que o procedimento é chamado | Quando seu aplicativo para de ser executado |
Em uma classe, Shared (o procedimento não é um membro da instância) |
A primeira vez que o procedimento é chamado em uma instância específica ou na própria classe ou estrutura do nome | Quando seu aplicativo para de ser executado |
Em uma instância de uma classe, não Shared (o procedimento é um membro da instância) |
A primeira vez que o procedimento é chamado em uma instância específica | Quando a instância é liberada para GC (coleta de lixo) |
Variáveis estáticas de mesmo nome
Você pode declarar variáveis estáticas com o mesmo nome em mais de um procedimento. Se você fizer isso, o compilador do Visual Basic considerará cada variável como um elemento separado. A inicialização de uma dessas variáveis não afeta os valores das outras. O mesmo se aplica se você definir um procedimento com um conjunto de sobrecargas e declarar uma variável estática com o mesmo nome em cada sobrecarga.
Contendo elementos para variáveis estáticas
Você pode declarar uma variável local estática dentro de uma classe, ou seja, dentro de um procedimento nessa classe. No entanto, você não pode declarar uma variável local estática dentro de uma estrutura, seja como um membro da estrutura ou como uma variável local de um procedimento dentro dessa estrutura.
Exemplo
Descrição
O exemplo a seguir declara uma variável com a palavra-chave Estática. (Observe que você não precisa da palavra-chave Dim
quando a Instrução Dim usa um modificador como Static
.)
Código
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Comentários
No exemplo anterior, a variável applesSold
continua a existir depois que o procedimento runningTotal
retorna ao código de chamada. A próxima vez que runningTotal
for chamada, applesSold
manterá seu valor calculado anteriormente.
Se applesSold
tivesse sido declarado sem usar Static
, os valores acumulados anteriores não seriam preservados entre chamadas para runningTotal
. A próxima vez que runningTotal
foi chamada, applesSold
teria sido recriada e inicializada como 0 e runningTotal
teria simplesmente retornado o mesmo valor com o qual foi chamado.
Compilar o código
Você pode inicializar o valor de uma variável local estática como parte de sua declaração. Se você declarar uma matriz como sendo Static
, poderá inicializar sua classificação (número de dimensões), o comprimento de cada dimensão e os valores dos elementos individuais.
Segurança
No exemplo anterior, você pode produzir o mesmo tempo de vida declarando applesSold
no nível do módulo. No entanto, se você alterasse o escopo de uma variável dessa forma, o procedimento não teria mais acesso exclusivo a ela. Como outros procedimentos podem acessar applesSold
e alterar seu valor, o total em execução pode não ser confiável e o código pode ser mais difícil de manter.