Durata 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 che hanno una durata. A questo scopo, il compilatore considera i parametri delle routine e i valori restituiti dalle funzioni 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 la variabile 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 dichiarata. Esiste una variabile non condivisa dichiarata in una classe o in 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 variabile Shared ha una singola durata, che si protrae 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 valore restituito da una funzione. Tuttavia, se tale routine ne chiama altre, le variabili locali mantengono i loro 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 dichiarato. 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 struttura variabile 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 routine, ad esempio un ciclo For, vengono inizializzate all'entrata nella routine. Queste inizializzazioni hanno effetto sia che il codice esegua o meno il blocco.

Fine della durata

Quando una routine termina, i valori delle variabili locali non vengono mantenuti e Visual Basic recupera la loro memoria. La volta successiva che si chiama la routine, tutte le relative variabili locali vengono create di nuovo 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 relative variabili non condivise. Tuttavia, le variabili Shared vengono mantenute fino a quando l'applicazione non viene arrestata.

Estensione della durata

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

Posizione e condivisione della routine Inizio della durata delle variabili statiche Fine della durata delle variabili statiche
In un modulo (condiviso per impostazione predefinita) La prima volta che viene chiamata la routine Quando l'esecuzione dell'applicazione viene arrestata
In una classe Shared (la routine non è un membro dell'istanza) La prima volta che la routine viene chiamata in un'istanza specifica o nella classe o nella struttura stessa Quando l'esecuzione dell'applicazione viene arrestata
In un'istanza di una classe, non Shared (la routine è un membro dell'istanza) La prima volta che la routine viene chiamata in un'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ù routine. 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 delle altre. 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.

Elementi contenitori 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

L'esempio seguente dichiara una variabile con la parola chiave Static. Si noti che la parola chiave Dim non è necessaria quando l'istruzione Dim usa un modificatore, ad esempio Static.

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 viene restituita al codice chiamante. La volta successiva che runningTotal viene chiamata, applesSold mantiene il valore calcolato in precedenza.

Se applesSold viene dichiarata senza usare Static, i valori accumulati in precedenza non vengono mantenuti tra le chiamate a runningTotal. La volta successiva che runningTotal viene chiamata, applesSold viene ricreata e inizializzata su 0 e runningTotal restituisce semplicemente lo stesso valore con cui è stata chiamata.

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 la classificazione (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 viene cambiato in questo modo, tuttavia, la routine non avrà più accesso esclusivo. Poiché altre routine potrebbero accedere a applesSold e cambiarne il valore, il totale parziale potrebbe non essere affidabile e il codice potrebbe essere più difficile da gestire.

Vedi anche