Tempo de vida no Visual Basic
O tempo de vida de um elemento declarado é o período de tempo durante o qual está disponível para utilização. As variáveis são os únicos elementos que têm tempo de vida. Para este propósito, o compilador trata parâmetros de procedimento e retornos de função 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 manter um valor. O seu valor pode mudar ao longo da sua vida útil, mas tem sempre algum valor.
Diferentes Vidas
Uma variável membro (declarada no nível do módulo, fora de qualquer procedimento) normalmente tem o mesmo tempo de vida que o elemento no qual é declarada. 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 uma dessas variáveis tem o mesmo tempo de vida que sua instância. No entanto, uma Shared
variável tem apenas um único tempo de vida, que dura todo o tempo em que seu aplicativo está em execução.
Uma variável local (declarada dentro de um procedimento) existe apenas enquanto o procedimento no qual ela é declarada está em execução. Isto aplica-se também aos parâmetros desse procedimento e a qualquer retorno de função. No entanto, se esse procedimento chamar outros procedimentos, as variáveis locais reterão seus valores enquanto os procedimentos chamados estiverem em execução.
Início da 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 com o valor padrão para seu tipo de dados assim que o procedimento começa a ser executado. Quando o procedimento encontra uma Dim
instrução que especifica valores iniciais, ele define essas variáveis para esses valores, mesmo que seu código já tenha atribuído outros valores a elas.
Cada membro de uma variável de estrutura é 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 For
loop) são inicializadas na entrada do procedimento. Essas inicializações entram em vigor independentemente de seu código executar ou não o bloco.
Fim da vida útil
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 suas variáveis locais serão criadas novamente e reinicializadas.
Quando uma instância de uma classe ou estrutura termina, suas variáveis não compartilhadas perdem sua memória e seus valores. Cada nova instância da classe ou estrutura cria e reinicializa suas variáveis não compartilhadas. No entanto, Shared
as variáveis são preservadas até que o aplicativo pare de ser executado.
Prolongamento da vida útil
Se você declarar uma variável local com a Static
palavra-chave, sua vida útil 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 Static
variável existe.
Localização e partilha do procedimento | Início do tempo de vida da variável estática | Fim do tempo de vida da variável estática |
---|---|---|
Em um módulo (compartilhado por padrão) | A primeira vez que o procedimento é chamado | Quando o aplicativo para de ser executado |
Em uma classe, Shared (procedure não é um membro da instância) |
A primeira vez que o procedimento é chamado em uma instância específica ou no próprio nome da classe ou estrutura | Quando o aplicativo para de ser executado |
Em uma instância de uma classe, não Shared (procedure é um membro da instância) |
A primeira vez que o procedimento é chamado na instância específica | Quando a instância é liberada para coleta de lixo (GC) |
Variáveis estáticas com o 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 considera cada uma dessas variáveis 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, como um membro da estrutura ou como uma variável local de um procedimento dentro dessa estrutura.
Exemplo
Description
O exemplo a seguir declara uma variável com a palavra-chave Static . (Observe que você não precisa da Dim
palavra-chave 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 runningTotal
que for chamada, applesSold
retém seu valor calculado anteriormente.
Se applesSold
tivessem sido declarados sem usar Static
o , os valores acumulados anteriores não seriam preservados nas chamadas para runningTotal
. A próxima vez runningTotal
que foi chamada, applesSold
teria sido recriada e inicializada para 0, e runningTotal
teria simplesmente retornado o mesmo valor com o qual foi chamada.
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 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 no nível do applesSold
módulo. No entanto, se alterasse o âmbito de uma variável desta forma, o procedimento deixaria de ter acesso exclusivo à mesma. 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.