Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De levensduur van een gedeclareerd element is de periode waarin het beschikbaar is voor gebruik. Variabelen zijn de enige elementen die de levensduur hebben. Voor dit doel behandelt de compiler procedureparameters en functie-retourwaarden als speciale gevallen van variabelen. De levensduur van een variabele vertegenwoordigt de periode waarin deze een waarde kan bevatten. De waarde kan in de loop van de levensduur veranderen, maar bevat altijd een bepaalde waarde.
Verschillende levensduurn
Een lidvariabele (gedeclareerd op moduleniveau, buiten een procedure) heeft doorgaans dezelfde levensduur als het element waarin deze wordt gedeclareerd. Een niet-gedeelde variabele die in een klasse of structuur is gedeclareerd, bestaat als een afzonderlijke kopie voor elk exemplaar van de klasse of structuur waarin deze wordt gedeclareerd. Elke variabele heeft dezelfde levensduur als het exemplaar. Een Shared variabele heeft echter slechts één levensduur, wat duurt voor de hele tijd dat uw toepassing wordt uitgevoerd.
Er bestaat alleen een lokale variabele (gedeclareerd binnen een procedure) terwijl de procedure waarin deze wordt gedeclareerd, wordt uitgevoerd. Dit geldt ook voor de parameters van die procedure en voor elke functie die wordt geretourneerd. Als deze procedure echter andere procedures aanroept, behouden de lokale variabelen hun waarden terwijl de aangeroepen procedures worden uitgevoerd.
Begin van levensduur
De levensduur van een lokale variabele begint wanneer het besturingselement de procedure invoert waarin deze wordt gedeclareerd. Elke lokale variabele wordt geïnitialiseerd tot de standaardwaarde voor het gegevenstype zodra de procedure wordt uitgevoerd. Wanneer de procedure een Dim instructie tegenkomt waarmee initiële waarden worden opgegeven, worden deze variabelen ingesteld op die waarden, zelfs als aan uw code al andere waarden zijn toegewezen.
Elk lid van een structuurvariabele wordt geïnitialiseerd alsof het een afzonderlijke variabele is. Op dezelfde manier wordt elk element van een matrixvariabele afzonderlijk geïnitialiseerd.
Variabelen die binnen een blok binnen een procedure (zoals een For lus) zijn gedeclareerd, worden geïnitialiseerd bij het invoeren van de procedure. Deze initialisaties worden van kracht, ongeacht of uw code het blok ooit uitvoert.
Einde levensduur
Wanneer een procedure wordt beëindigd, blijven de waarden van de lokale variabelen niet behouden en maakt Visual Basic hun geheugen vrij. De volgende keer dat u de procedure aanroept, worden alle lokale variabelen opnieuw gemaakt en opnieuw geïnitialiseerd.
Wanneer een exemplaar van een klasse of structuur wordt beëindigd, verliezen de niet-gedeelde variabelen hun geheugen en hun waarden. Met elke nieuwe instantie van de klasse of structuur worden de niet-gedeelde variabelen gemaakt en opnieuw geïnitialiseerd.
Shared Variabelen blijven echter behouden totdat de toepassing niet meer wordt uitgevoerd.
Verlenging van levensduur
Als u een lokale variabele declareert met het Static trefwoord, is de levensduur langer dan de uitvoeringstijd van de procedure. In de volgende tabel ziet u hoe de proceduredeclaratie bepaalt hoe lang een Static variabele bestaat.
| Locatie en delen van procedure | De levensduur van statische variabelen begint | Levensduur van statische variabelen eindigt |
|---|---|---|
| In een module (standaard gedeeld) | De eerste keer dat de procedure wordt aangeroepen | Wanneer uw toepassing niet meer wordt uitgevoerd |
In een klasse Shared (procedure is geen instantielid) |
De eerste keer dat de procedure wordt uitgevoerd op een specifieke instantie of op de naam van de klasse of structuur zelf | Wanneer uw toepassing niet meer wordt uitgevoerd |
Bij een instantie van een klasse, niet Shared (procedure is een instantie-lid) |
De eerste keer dat de procedure wordt aangeroepen voor het specifieke exemplaar | Wanneer het exemplaar wordt vrijgegeven voor garbagecollection (GC) |
Statische variabelen van dezelfde naam
U kunt statische variabelen met dezelfde naam declareren in meer dan één procedure. Als u dit doet, beschouwt de Visual Basic-compiler elke variabele als een afzonderlijk element. De initialisatie van een van deze variabelen heeft geen invloed op de waarden van de andere variabelen. Hetzelfde geldt als u een procedure definieert met een set overbelastingen en een statische variabele declareert met dezelfde naam bij elke overbelasting.
Elementen voor statische variabelen bevatten
U kunt een statische lokale variabele binnen een klasse declareren, dat wil zeggen binnen een procedure in die klasse. U kunt echter geen statische lokale variabele binnen een structuur declareren, hetzij als structuurlid of als lokale variabele van een procedure binnen die structuur.
Voorbeeld
Beschrijving
In het volgende voorbeeld wordt een variabele gede declareert met het trefwoord Statisch . (Houd er rekening mee dat u het Dim trefwoord niet nodig hebt wanneer de Dim-instructie een wijzigingsfunctie gebruikt, zoals Static.)
Code
Function runningTotal(ByVal num As Integer) As Integer
Static applesSold As Integer
applesSold = applesSold + num
Return applesSold
End Function
Opmerkingen
In het voorgaande voorbeeld blijft de variabele applesSold bestaan nadat de procedure runningTotal terugkeert naar de aanroepende code. De volgende keer dat runningTotal wordt aangeroepen, behoudt applesSold de eerder berekende waarde.
Als applesSold was gedeclareerd zonder gebruik van Static, zouden de eerder opgeslagen waarden niet behouden blijven bij het aanroepen van runningTotal. De volgende keer dat runningTotal werd aangeroepen, zou applesSold opnieuw zijn aangemaakt en naar de waarde 0 geïnitialiseerd, en runningTotal zou dezelfde waarde hebben geretourneerd waarmee het werd aangeroepen.
De code compileren
U kunt de waarde van een statische lokale variabele initialiseren als onderdeel van de declaratie. Als u een matrix declareert, Statickunt u de rang (aantal dimensies), de lengte van elke dimensie en de waarden van de afzonderlijke elementen initialiseren.
Veiligheid
In het voorgaande voorbeeld kunt u dezelfde levensduur produceren door op moduleniveau te declareren applesSold . Als u het bereik van een variabele op deze manier hebt gewijzigd, heeft de procedure echter geen exclusieve toegang meer. Omdat andere procedures toegang kunnen krijgen tot applesSold en de waarde kunnen wijzigen, kan het lopende totaal onbetrouwbaar zijn en kan de code moeilijker te onderhouden zijn.