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.

Confira também