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 en Loop

  • For [Each] en Next

  • If en End If

  • Select en End Select

  • SyncLock en End SyncLock

  • Try en End Try

  • While en End While

  • With en End 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 Ifen 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 elk intTemp wordt gedeclareerd als een lokale variabele, herkent elke procedure alleen een eigen versie van intTemp. Elke procedure kan de waarde in de lokale intTemp waarde wijzigen zonder dat dit van invloed is op intTemp 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 of Static 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.

Zie ook