Durata in Visual BasicLifetime in Visual Basic

La durata di un elemento dichiarato è il periodo di tempo durante il quale è disponibile per l'utilizzo.The lifetime of a declared element is the period of time during which it is available for use. Le variabili sono gli unici elementi con durata.Variables are the only elements that have lifetime. A questo scopo, il compilatore considera i parametri della routine e la funzione restituisce come casi speciali di variabili.For this purpose, the compiler treats procedure parameters and function returns as special cases of variables. La durata di una variabile rappresenta il periodo di tempo durante il quale può conservare un valore.The lifetime of a variable represents the period of time during which it can hold a value. Il valore può variare nel corso della sua durata, ma include sempre un valore.Its value can change over its lifetime, but it always holds some value.

Durate diverseDifferent Lifetimes

Una variabile membro (dichiarata a livello di modulo, all'esterno di qualsiasi routine) ha in genere la stessa durata dell'elemento in cui è dichiarata.A member variable (declared at module level, outside any procedure) typically has the same lifetime as the element in which it is declared. Una variabile non condivisa dichiarata in una classe o struttura esiste come copia separata per ogni istanza della classe o della struttura in cui è dichiarata.A nonshared variable declared in a class or structure exists as a separate copy for each instance of the class or structure in which it is declared. Ogni variabile di questo tipo ha la stessa durata della relativa istanza.Each such variable has the same lifetime as its instance. Tuttavia, una Shared variabile ha una sola durata, che dura per tutto il tempo in cui l'applicazione è in esecuzione.However, a Shared variable has only a single lifetime, which lasts for the entire time your application is running.

Una variabile locale , dichiarata all'interno di una routine, esiste solo se è in esecuzione la procedura in cui è dichiarata.A local variable (declared inside a procedure) exists only while the procedure in which it is declared is running. Questo vale anche per i parametri di tale procedura e per qualsiasi funzione restituita.This applies also to that procedure's parameters and to any function return. Tuttavia, se tale procedura chiama altre routine, le variabili locali manterranno i valori mentre le stored procedure chiamate sono in esecuzione.However, if that procedure calls other procedures, the local variables retain their values while the called procedures are running.

Inizio della durataBeginning of Lifetime

La durata di una variabile locale inizia quando il controllo immette la routine in cui è dichiarata.A local variable's lifetime begins when control enters the procedure in which it is declared. Ogni variabile locale viene inizializzata sul valore predefinito per il tipo di dati non appena viene avviata l'esecuzione della stored procedure.Every local variable is initialized to the default value for its data type as soon as the procedure begins running. Quando la procedura rileva un' Dim istruzione che specifica i valori iniziali, imposta tali variabili su tali valori, anche se al codice sono già stati assegnati altri valori.When the procedure encounters a Dim statement that specifies initial values, it sets those variables to those values, even if your code had already assigned other values to them.

Ogni membro di una variabile di struttura viene inizializzato come se fosse una variabile separata.Each member of a structure variable is initialized as if it were a separate variable. Analogamente, ogni elemento di una variabile di matrice viene inizializzato singolarmente.Similarly, each element of an array variable is initialized individually.

Le variabili dichiarate all'interno di un blocco all'interno di una routine, ad esempio un For ciclo, vengono inizializzate alla voce della routine.Variables declared within a block inside a procedure (such as a For loop) are initialized on entry to the procedure. Queste inizializzazioni hanno effetto indipendentemente dall'esecuzione del blocco da parte del codice.These initializations take effect whether or not your code ever executes the block.

Fine della durataEnd of Lifetime

Quando una stored procedure viene terminata, i valori delle relative variabili locali non vengono mantenuti e Visual Basic recupera la memoria.When a procedure terminates, the values of its local variables are not preserved, and Visual Basic reclaims their memory. Alla successiva chiamata della stored procedure, tutte le relative variabili locali vengono create di nuovo e reinizializzate.The next time you call the procedure, all its local variables are created afresh and reinitialized.

Quando un'istanza di una classe o di una struttura termina, le variabili non condivise perdono la memoria e i relativi valori.When an instance of a class or structure terminates, its nonshared variables lose their memory and their values. Ogni nuova istanza della classe o della struttura crea e reinizializza le variabili non condivise.Each new instance of the class or structure creates and reinitializes its nonshared variables. Tuttavia, Shared le variabili vengono mantenute finché l'esecuzione dell'applicazione non viene arrestata.However, Shared variables are preserved until your application stops running.

Estensione della durataExtension of Lifetime

Se si dichiara una variabile locale con la Static parola chiave, la durata è maggiore del tempo di esecuzione della relativa procedura.If you declare a local variable with the Static keyword, its lifetime is longer than the execution time of its procedure. Nella tabella seguente viene illustrato come la dichiarazione di routine determini per quanto tempo una Static variabile esiste.The following table shows how the procedure declaration determines how long a Static variable exists.

Percorso e condivisione delle procedureProcedure location and sharing Inizio durata variabile staticaStatic variable lifetime begins Fine della durata variabile staticaStatic variable lifetime ends
In un modulo (condiviso per impostazione predefinita)In a module (shared by default) La prima volta che viene chiamata la stored procedureThe first time the procedure is called Quando l'esecuzione dell'applicazione viene arrestataWhen your application stops running
In una classe, Shared (la routine non è un membro di istanza)In a class, Shared (procedure is not an instance member) La prima volta che la stored procedure viene chiamata su un'istanza specifica o sul nome della classe o della struttura stessaThe first time the procedure is called either on a specific instance or on the class or structure name itself Quando l'esecuzione dell'applicazione viene arrestataWhen your application stops running
In un'istanza di una classe, Not Shared (la procedura è un membro di istanza)In an instance of a class, not Shared (procedure is an instance member) La prima volta che la stored procedure viene chiamata sull'istanza specificaThe first time the procedure is called on the specific instance Quando l'istanza viene rilasciata per Garbage Collection (GC)When the instance is released for garbage collection (GC)

Variabili statiche con lo stesso nomeStatic Variables of the Same Name

È possibile dichiarare variabili statiche con lo stesso nome in più di una procedura.You can declare static variables with the same name in more than one procedure. In tal caso, il compilatore Visual Basic considera ciascuna variabile come un elemento separato.If you do this, the Visual Basic compiler considers each such variable to be a separate element. L'inizializzazione di una di queste variabili non influisce sui valori degli altri.The initialization of one of these variables does not affect the values of the others. 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.The same applies if you define a procedure with a set of overloads and declare a static variable with the same name in each overload.

Contenitore di elementi per variabili staticheContaining Elements for Static Variables

È possibile dichiarare una variabile locale statica all'interno di una classe, ovvero all'interno di una routine di tale classe.You can declare a static local variable within a class, that is, inside a procedure in that class. 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.However, you cannot declare a static local variable within a structure, either as a structure member or as a local variable of a procedure within that structure.

EsempioExample

DescrizioneDescription

Nell'esempio seguente viene dichiarata una variabile con la parola chiave static .The following example declares a variable with the Static keyword. Si noti che non è necessaria la Dim parola chiave quando l' istruzione Dim usa un modificatore, ad esempio Static .(Note that you do not need the Dim keyword when the Dim Statement uses a modifier such as Static.)

CodiceCode

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

CommentiComments

Nell'esempio precedente, la variabile applesSold continua a esistere dopo che la procedura viene runningTotal restituita al codice chiamante.In the preceding example, the variable applesSold continues to exist after the procedure runningTotal returns to the calling code. La volta successiva che runningTotal viene chiamato, applesSold mantiene il valore calcolato in precedenza.The next time runningTotal is called, applesSold retains its previously calculated value.

Se applesSold è stata dichiarata senza usare Static , i valori accumulati precedenti non verrebbero conservati tra le chiamate a runningTotal .If applesSold had been declared without using Static, the previous accumulated values would not be preserved across calls to runningTotal. La volta successiva che runningTotal è stata chiamata, applesSold verrebbe ricreata e inizializzata su 0 e runningTotal avrebbe restituito semplicemente lo stesso valore con cui è stato chiamato.The next time runningTotal was called, applesSold would have been recreated and initialized to 0, and runningTotal would have simply returned the same value with which it was called.

Compilare il codiceCompile the code

È possibile inizializzare il valore di una variabile locale statica come parte della relativa dichiarazione.You can initialize the value of a static local variable as part of its declaration. Se si dichiara una matrice come Static , è possibile inizializzare il relativo rango (numero di dimensioni), la lunghezza di ogni dimensione e i valori dei singoli elementi.If you declare an array to be Static, you can initialize its rank (number of dimensions), the length of each dimension, and the values of the individual elements.

SicurezzaSecurity

Nell'esempio precedente, è possibile produrre la stessa durata dichiarando applesSold a livello di modulo.In the preceding example, you can produce the same lifetime by declaring applesSold at module level. Se l'ambito di una variabile è stato modificato in questo modo, tuttavia, la procedura non avrà più accesso esclusivo.If you changed the scope of a variable this way, however, the procedure would no longer have exclusive access to it. Poiché altre procedure possono accedere applesSold e modificare il valore, il totale parziale potrebbe essere inaffidabile e il codice potrebbe essere più difficile da gestire.Because other procedures could access applesSold and change its value, the running total could be unreliable and the code could be more difficult to maintain.

Vedi ancheSee also