Condividi tramite


Durata di vita in Visual Basic

La durata di un elemento dichiarato è il periodo di tempo durante il quale è disponibile per l'uso. Le variabili sono gli unici elementi con durata. A questo scopo, il compilatore tratta i parametri della procedura e le restituzioni della funzione come casi speciali di variabili. La durata di una variabile rappresenta il periodo di tempo durante il quale può contenere un valore. Il valore può cambiare nel corso della durata, ma contiene sempre un valore.

Durate diverse

Una variabile membro (dichiarata a livello di modulo, all'esterno di qualsiasi routine) ha in genere la stessa durata dell'elemento in cui viene dichiarato. Esiste una variabile non condivisa dichiarata in una classe o una struttura come copia separata per ogni istanza della classe o della struttura in cui è dichiarata. Ogni variabile di questo tipo ha la stessa durata dell'istanza. Tuttavia, una Shared variabile ha una sola durata, che dura per l'intero periodo di esecuzione dell'applicazione.

Una variabile locale (dichiarata all'interno di una routine) esiste solo durante l'esecuzione della routine in cui viene dichiarata. Questo vale anche per i parametri di tale routine e per qualsiasi funzione restituita. Tuttavia, se tale procedura chiama altre procedure, le variabili locali mantengono i relativi valori durante l'esecuzione delle routine chiamate.

Inizio della durata

La durata di una variabile locale inizia quando il controllo entra nella routine in cui viene dichiarata. Ogni variabile locale viene inizializzata sul valore predefinito per il relativo tipo di dati non appena inizia l'esecuzione della routine. Quando la routine rileva un'istruzione Dim che specifica i valori iniziali, imposta tali variabili su tali valori, anche se il codice aveva già assegnato altri valori.

Ogni membro di una variabile di struttura viene inizializzato come se fosse una variabile separata. Analogamente, ogni elemento di una variabile di matrice viene inizializzato singolarmente.

Le variabili dichiarate in un blocco all'interno di una procedura, ad esempio un For ciclo, vengono inizializzate all'ingresso della procedura. Queste inizializzazioni hanno effetto indipendentemente dal fatto che il codice esegua o meno il blocco.

Fine del ciclo di vita

Quando una routine termina, i valori delle variabili locali non vengono mantenuti e Visual Basic recupera la memoria. La prossima volta che si chiama la procedura, vengono create tutte le relative variabili locali e reinizializzate.

Quando un'istanza di una classe o di una struttura termina, le variabili non condivise perdono la memoria e i relativi valori. Ogni nuova istanza della classe o della struttura crea e reinizializza le variabili non condivise. Tuttavia, Shared le variabili vengono mantenute fino a quando l'applicazione non viene arrestata.

Estensione della durata

Se si dichiara una variabile locale con la Static parola chiave , la durata è superiore al tempo di esecuzione della relativa routine. Nella tabella seguente viene illustrato come la dichiarazione di routine determina per quanto tempo esiste una Static variabile.

Posizione e condivisione delle procedure La durata delle variabili statiche inizia Durata variabile statica termina
In un modulo (condiviso per impostazione predefinita) La prima volta che la procedura viene chiamata Quando l'applicazione smette di eseguire
In una classe, Shared (la procedura non è un membro dell'istanza) La prima volta che la routine viene chiamata in un'istanza specifica o nel nome della classe o della struttura stessa Quando l'applicazione smette di eseguire
In un'istanza di una classe, non Shared (routine è un membro dell'istanza) La prima volta che la procedura viene chiamata sull'istanza specifica Quando l'istanza viene rilasciata per Garbage Collection (GC)

Variabili statiche con lo stesso nome

È possibile dichiarare variabili statiche con lo stesso nome in più procedure. In questo caso, il compilatore di Visual Basic considera ogni variabile come un elemento separato. L'inizializzazione di una di queste variabili non influisce sui valori degli altri. Lo stesso vale se si definisce una routine con un set di overload e si dichiara una variabile statica con lo stesso nome in ogni overload.

Contenitore di elementi per variabili statiche

È possibile dichiarare una variabile locale statica all'interno di una classe, ovvero all'interno di una routine di tale classe. Tuttavia, non è possibile dichiarare una variabile locale statica all'interno di una struttura, come membro della struttura o come variabile locale di una routine all'interno di tale struttura.

Esempio

Descrizione

Nell'esempio seguente viene dichiarata una variabile con la parola chiave Static . Si noti che non è necessaria la Dim parola chiave quando l'istruzione Dim usa un modificatore, Staticad esempio .

Codice

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

Commenti

Nell'esempio precedente la variabile applesSold continua a esistere dopo che la routine runningTotal torna al codice chiamante. La volta runningTotal successiva viene chiamata, applesSold mantiene il valore calcolato in precedenza.

Se applesSold fosse stato dichiarato senza usare Static, i valori accumulati precedenti non verranno mantenuti tra le chiamate a runningTotal. La volta runningTotal successiva è stata chiamata, applesSold sarebbe stata ricreata e inizializzata su 0 e runningTotal avrebbe semplicemente restituito lo stesso valore con cui è stato chiamato.

Compilare il codice

È possibile inizializzare il valore di una variabile locale statica come parte della relativa dichiarazione. Se si dichiara una matrice come Static, è possibile inizializzarne il rango (numero di dimensioni), la lunghezza di ogni dimensione e i valori dei singoli elementi.

Sicurezza

Nell'esempio precedente è possibile produrre la stessa durata dichiarando applesSold a livello di modulo. Se l'ambito di una variabile è stato modificato in questo modo, tuttavia, la procedura non avrà più accesso esclusivo. Poiché altre procedure potrebbero accedere applesSold e modificarne il valore, il totale in esecuzione potrebbe non essere affidabile e il codice potrebbe essere più difficile da gestire.

Vedere anche