Share via


Levensduur in Visual Basic

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 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 lid van het exemplaar) De eerste keer dat de procedure wordt aangeroepen op een specifiek exemplaar of op de naam van de klasse of structuur zelf Wanneer uw toepassing niet meer wordt uitgevoerd
In een instantie van een klasse, niet Shared (procedure is een exemplaarlid) De eerste keer dat de procedure wordt aangeroepen op 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.

Opmerking

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 runningTotal wordt aangeroepen, applesSold behoudt u de eerder berekende waarde.

Als applesSold deze zonder gebruik Staticwas gedeclareerd, zouden de eerder samengevoegde waarden niet behouden blijven bij aanroepen naar runningTotal. De volgende keer runningTotal dat werd aangeroepen, applesSold zou opnieuw zijn gemaakt en geïnitialiseerd tot 0, en runningTotal zou gewoon dezelfde waarde hebben geretourneerd waarmee deze 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.

Beveiliging

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 de waarde ervan kunnen openen applesSold en wijzigen, kan het lopende totaal onbetrouwbaar zijn en kan de code moeilijker te onderhouden zijn.

Zie ook