Livslängd i Visual Basic
Livslängden för ett deklarerat element är den tidsperiod under vilken det är tillgängligt för användning. Variabler är de enda element som har livslängd. För detta ändamål behandlar kompilatorn procedureparametrar och funktionsreturer som specialfall av variabler. Livslängden för en variabel representerar den tidsperiod under vilken den kan innehålla ett värde. Dess värde kan ändras under dess livslängd, men det innehåller alltid ett visst värde.
Olika livslängder
En medlemsvariabel (deklarerad på modulnivå, utanför någon procedur) har vanligtvis samma livslängd som elementet där den deklareras. En icke-delad variabel som deklareras i en klass eller struktur finns som en separat kopia för varje instans av klassen eller strukturen där den deklareras. Varje sådan variabel har samma livslängd som sin instans. En variabel har dock Shared
bara en enda livslängd, som varar under hela tiden som programmet körs.
Det finns bara en lokal variabel (deklarerad i en procedur) medan proceduren som den deklareras körs i. Detta gäller även för den procedurens parametrar och för alla funktionsreturer. Men om den proceduren anropar andra procedurer behåller de lokala variablerna sina värden medan de anropade procedurerna körs.
Livslängdens början
En lokal variabels livslängd börjar när kontrollen anger den procedur som den deklareras i. Varje lokal variabel initieras till standardvärdet för dess datatyp så snart proceduren börjar köras. När proceduren påträffar en Dim
instruktion som anger initiala värden, anger den dessa variabler till dessa värden, även om koden redan hade tilldelat andra värden till dem.
Varje medlem i en strukturvariabel initieras som om den vore en separat variabel. På samma sätt initieras varje element i en matrisvariabel individuellt.
Variabler som deklareras inom ett block i en procedur (till exempel en For
loop) initieras vid inmatning till proceduren. Dessa initieringar träder i kraft oavsett om koden någonsin kör blocket eller inte.
Livslängdens slut
När en procedur avslutas bevaras inte värdena för dess lokala variabler och Visual Basic återtar sitt minne. Nästa gång du anropar proceduren skapas alla dess lokala variabler på nytt och initieras igen.
När en instans av en klass eller struktur avslutas förlorar dess icke-delade variabler sitt minne och sina värden. Varje ny instans av klassen eller strukturen skapar och initierar om dess icke-delade variabler. Variabler bevaras dock Shared
tills programmet slutar köras.
Livslängdstillägg
Om du deklarerar en lokal variabel med nyckelordet Static
är dess livslängd längre än körningstiden för proceduren. I följande tabell visas hur procedurdeklarationen avgör hur länge en Static
variabel finns.
Procedurplats och delning | Livslängden för statisk variabel börjar | Livslängden för statisk variabel upphör |
---|---|---|
I en modul (delas som standard) | Första gången proceduren anropas | När programmet slutar köras |
I en klass ( Shared proceduren är inte en instansmedlem) |
Första gången proceduren anropas antingen på en specifik instans eller på själva klass- eller strukturnamnet | När programmet slutar köras |
I en instans av en klass, inte Shared (proceduren är en instansmedlem) |
Första gången proceduren anropas på den specifika instansen | När instansen släpps för skräpinsamling (GC) |
Statiska variabler med samma namn
Du kan deklarera statiska variabler med samma namn i mer än en procedur. Om du gör detta anser Visual Basic-kompilatorn att varje sådan variabel är ett separat element. Initieringen av en av dessa variabler påverkar inte de andras värden. Detsamma gäller om du definierar en procedur med en uppsättning överlagringar och deklarerar en statisk variabel med samma namn i varje överlagring.
Innehåller element för statiska variabler
Du kan deklarera en statisk lokal variabel i en klass, det vill säga inuti en procedur i den klassen. Du kan dock inte deklarera en statisk lokal variabel i en struktur, antingen som en strukturmedlem eller som en lokal variabel för en procedur i den strukturen.
Exempel
beskrivning
I följande exempel deklareras en variabel med nyckelordet Statisk . (Observera att du inte behöver nyckelordet Dim
när Dim-instruktionenanvänder en modifierare som Static
.)
Kod
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Kommentarer
I föregående exempel fortsätter variabeln applesSold
att finnas när proceduren runningTotal
återgår till den anropande koden. Nästa gång runningTotal
anropas applesSold
behåller det tidigare beräknade värdet.
Om applesSold
hade deklarerats utan att använda Static
bevaras inte tidigare ackumulerade värden mellan anrop till runningTotal
. Nästa gång runningTotal
anropades, applesSold
skulle ha återskapats och initierats till 0, och runningTotal
skulle helt enkelt ha returnerat samma värde som det anropades med.
Kompilera koden
Du kan initiera värdet för en statisk lokal variabel som en del av deklarationen. Om du deklarerar en matris som Static
kan du initiera dess rangordning (antal dimensioner), längden på varje dimension och värdena för de enskilda elementen.
Säkerhet
I föregående exempel kan du skapa samma livslängd genom att applesSold
deklarera på modulnivå. Om du har ändrat omfånget för en variabel på det här sättet skulle proceduren dock inte längre ha exklusiv åtkomst till den. Eftersom andra procedurer kan komma åt applesSold
och ändra dess värde kan den löpande summan vara otillförlitlig och koden kan vara svårare att underhålla.