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.