Bereik in Visual Basic
Het bereik van een gedeclareerd element is de set met alle code die ernaar kan verwijzen zonder de naam ervan in aanmerking te komen of het beschikbaar te maken via een importinstructie (.NET-naamruimte en -type). Een element kan een bereik hebben op een van de volgende niveaus:
Niveau | Beschrijving |
---|---|
Bereik blokkeren | Alleen beschikbaar in het codeblok waarin het wordt gedeclareerd |
Procedurebereik | Beschikbaar voor alle code binnen de procedure waarin deze wordt gedeclareerd |
Modulebereik | Beschikbaar voor alle code in de module, klasse of structuur waarin deze wordt gedeclareerd |
Bereik van naamruimte | Beschikbaar voor alle code in de naamruimte waarin deze wordt gedeclareerd |
Deze niveaus van bereikvoortgang van het smalste (blok) naar de breedste (naamruimte), waarbij het kleinste bereik de kleinste set code betekent die zonder kwalificatie naar het element kan verwijzen. Zie 'Niveaus van bereik' op deze pagina voor meer informatie.
Bereik opgeven en variabelen definiëren
U geeft het bereik van een element op wanneer u dit declareert. Het bereik kan afhankelijk zijn van de volgende factoren:
De regio (blok, procedure, module, klasse of structuur) waarin u het element declareert
De naamruimte met de declaratie van het element
Het toegangsniveau dat u declareert voor het element
Wees voorzichtig wanneer u variabelen met dezelfde naam maar een ander bereik definieert, omdat dit kan leiden tot onverwachte resultaten. Zie Verwijzingen naar gedeclareerde elementen voor meer informatie.
Bereikniveaus
Er is een programmeerelement beschikbaar in de regio waarin u dit declareert. Alle code in dezelfde regio kan verwijzen naar het element zonder de naam ervan te kwalificeren.
Bereik blokkeren
Een blok is een set instructies die zijn opgenomen in initiëren en beëindigen van declaratie-instructies, zoals:
Do
enLoop
For
[Each
] enNext
If
enEnd If
Select
enEnd Select
SyncLock
enEnd SyncLock
Try
enEnd Try
While
enEnd While
With
enEnd With
Als u een variabele binnen een blok declareert, kunt u deze alleen binnen dat blok gebruiken. In het volgende voorbeeld is het bereik van de variabele cube
geheel getal het blok tussen If
en End If
en kunt u niet meer verwijzen cube
wanneer de uitvoering uit het blok komt.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Notitie
Zelfs als het bereik van een variabele beperkt is tot een blok, is de levensduur nog steeds die van de hele procedure. Als u het blok meerdere keren invoert tijdens de procedure, behoudt elke blokvariabele de vorige waarde. Om onverwachte resultaten in een dergelijk geval te voorkomen, is het verstandig om blokvariabelen aan het begin van het blok te initialiseren.
Procedurebereik
Een element dat binnen een procedure is gedeclareerd, is niet beschikbaar buiten die procedure. Alleen de procedure die de declaratie bevat, kan deze gebruiken. Variabelen op dit niveau worden ook wel lokale variabelen genoemd. U declareert ze met de Dim-instructie, met of zonder het statische trefwoord.
Procedure- en blokbereik zijn nauw verwant. Als u een variabele binnen een procedure declareert, maar buiten een blok binnen die procedure, kunt u de variabele beschouwen als blokbereik, waarbij het blok de hele procedure is.
Notitie
Alle lokale elementen, zelfs als het variabelen zijn Static
, zijn privé voor de procedure waarin ze worden weergegeven. U kunt geen element declareren met behulp van het openbare trefwoord binnen een procedure.
Modulebereik
Voor het gemak geldt het moduleniveau voor één term evenzeer voor modules, klassen en structuren. U kunt elementen op dit niveau declareren door de declaratie-instructie buiten een procedure of blok te plaatsen, maar binnen de module, klasse of structuur.
Wanneer u een declaratie maakt op moduleniveau, bepaalt het toegangsniveau dat u kiest het bereik. De naamruimte die de module, klasse of structuur bevat, heeft ook invloed op het bereik.
Elementen waarvoor u privétoegangsniveau declareert, zijn beschikbaar voor elke procedure in die module, maar niet voor code in een andere module. De Dim
instructie op moduleniveau is standaard ingesteld Private
als u geen trefwoorden op toegangsniveau gebruikt. U kunt het bereik en toegangsniveau echter duidelijker maken met behulp van het Private
trefwoord in de Dim
instructie.
In het volgende voorbeeld kunnen alle procedures die in de module zijn gedefinieerd, verwijzen naar de tekenreeksvariabele strMsg
. Wanneer de tweede procedure wordt aangeroepen, wordt de inhoud van de tekenreeksvariabele strMsg
weergegeven in een dialoogvenster.
' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
MsgBox(strMsg)
End Sub
Bereik van naamruimte
Als u een element declareert op moduleniveau met behulp van het trefwoord Vriend of Openbaar , wordt het beschikbaar voor alle procedures in de naamruimte waarin het element wordt gedeclareerd. Met de volgende wijziging in het voorgaande voorbeeld kan de tekenreeksvariabele overal in de naamruimte van de declaratie naar de tekenreeksvariabele strMsg
worden verwezen.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
Het bereik van de naamruimte bevat geneste naamruimten. Een element dat beschikbaar is vanuit een naamruimte, is ook beschikbaar vanuit elke naamruimte die binnen die naamruimte is genest.
Als uw project geen naamruimte-instructiesbevat, bevindt alles in het project zich in dezelfde naamruimte. In dit geval kan het bereik van de naamruimte worden beschouwd als projectbereik. Public
elementen in een module, klasse of structuur zijn ook beschikbaar voor elk project dat verwijst naar hun project.
Keuze van bereik
Wanneer u een variabele declareert, moet u rekening houden met de volgende punten bij het kiezen van het bereik.
Voordelen van lokale variabelen
Lokale variabelen zijn een goede keuze voor elk soort tijdelijke berekening, om de volgende redenen:
Naam conflict vermijding. Namen van lokale variabelen zijn niet vatbaar voor conflicten. U kunt bijvoorbeeld verschillende procedures maken met een variabele met de naam
intTemp
. Zolang elkintTemp
wordt gedeclareerd als een lokale variabele, herkent elke procedure alleen een eigen versie vanintTemp
. Elke procedure kan de waarde in de lokaleintTemp
waarde wijzigen zonder dat dit van invloed is opintTemp
variabelen in andere procedures.Geheugenverbruik. Lokale variabelen verbruiken alleen geheugen terwijl hun procedure wordt uitgevoerd. Het geheugen wordt vrijgegeven wanneer de procedure terugkeert naar de aanroepende code. Gedeelde en statische variabelen verbruiken daarentegen geheugenbronnen totdat uw toepassing stopt, dus gebruik ze alleen wanneer dat nodig is. Instantievariabelen verbruiken geheugen terwijl hun exemplaar blijft bestaan, waardoor ze minder efficiënt zijn dan lokale variabelen, maar mogelijk efficiënter dan
Shared
ofStatic
variabelen.
Bereik minimaliseren
Over het algemeen is het bij het declareren van een variabele of constante een goede programmeerpraktijk om het bereik zo smal mogelijk te maken (blokbereik is het smalste). Dit helpt geheugen te besparen en de kans dat uw code foutloos verwijst naar de verkeerde variabele te minimaliseren. Op dezelfde manier moet u een variabele alleen statisch declareren wanneer het nodig is om de waarde tussen procedureoproepen te behouden.