Omfång i Visual Basic
Omfånget för ett deklarerat element är uppsättningen med all kod som kan referera till den utan att kvalificera dess namn eller göra den tillgänglig via en importinstruktor (.NET-namnområde och typ). Ett element kan ha omfång på någon av följande nivåer:
Nivå | beskrivning |
---|---|
Blockera omfång | Endast tillgängligt i kodblocket där det deklareras |
Proceduromfång | Tillgänglig för all kod inom den procedur där den deklareras |
Modulomfång | Tillgänglig för all kod i modulen, klassen eller strukturen där den deklareras |
Namnområdesomfång | Tillgänglig för all kod i namnområdet där den deklareras |
Dessa omfångsnivåer förlopp från det smalaste (blocket) till det bredaste (namnområdet), där det smalaste omfånget innebär den minsta uppsättningen kod som kan referera till elementet utan kvalificering. Mer information finns i "Omfångsnivåer" på den här sidan.
Ange omfång och definiera variabler
Du anger omfånget för ett element när du deklarerar det. Omfånget kan bero på följande faktorer:
Regionen (block, procedur, modul, klass eller struktur) där du deklarerar elementet
Namnområdet som innehåller elementets deklaration
Den åtkomstnivå som du deklarerar för elementet
Var försiktig när du definierar variabler med samma namn men ett annat omfång, eftersom det kan leda till oväntade resultat. Mer information finns i Referenser till deklarerade element.
Omfångsnivåer
Ett programmeringselement är tillgängligt i hela regionen där du deklarerar det. All kod i samma region kan referera till elementet utan att kvalificera dess namn.
Blockera omfång
Ett block är en uppsättning instruktioner som omges av inledande och avslutande deklarationsuttryck, till exempel följande:
Do
ochLoop
For
[Each
] ochNext
If
ochEnd If
Select
ochEnd Select
SyncLock
ochEnd SyncLock
Try
ochEnd Try
While
ochEnd While
With
ochEnd With
Om du deklarerar en variabel i ett block kan du bara använda den i det blocket. I följande exempel är omfånget för heltalsvariabeln cube
blocket mellan If
och End If
, och du kan inte längre referera till cube
när körningen passerar ut ur blocket.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Kommentar
Även om en variabels omfång är begränsat till ett block är dess livslängd fortfarande den för hela proceduren. Om du anger blocket mer än en gång under proceduren behåller varje blockvariabel sitt tidigare värde. För att undvika oväntade resultat i ett sådant fall är det klokt att initiera blockvariabler i början av blocket.
Proceduromfång
Ett element som deklarerats inom en procedur är inte tillgängligt utanför den proceduren. Endast den procedur som innehåller deklarationen kan använda den. Variabler på den här nivån kallas även lokala variabler. Du deklarerar dem med Dim-instruktionen, med eller utan nyckelordet Statisk.
Proceduren och blockomfånget är nära relaterade. Om du deklarerar en variabel i en procedur men utanför något block i den proceduren kan du tänka dig att variabeln har blockomfång, där blocket är hela proceduren.
Kommentar
Alla lokala element, även om de är Static
variabler, är privata för proceduren där de visas. Du kan inte deklarera något element med hjälp av det offentliga nyckelordet i en procedur.
Modulomfång
För enkelhetens skull gäller modulnivån för en term lika för moduler, klasser och strukturer. Du kan deklarera element på den här nivån genom att placera deklarationssatsen utanför någon procedur eller ett block, men inom modulen, klassen eller strukturen.
När du gör en deklaration på modulnivå avgör den åtkomstnivå du väljer omfånget. Namnområdet som innehåller modulen, klassen eller strukturen påverkar också omfånget.
Element som du deklarerar privat åtkomstnivå för är tillgängliga för varje procedur i modulen, men inte för någon kod i en annan modul. Instruktionen Dim
på modulnivå är standard om Private
du inte använder några nyckelord på åtkomstnivå. Du kan dock göra omfångs- och åtkomstnivån tydligare med hjälp av nyckelordet Private
i -instruktionen Dim
.
I följande exempel kan alla procedurer som definierats i modulen referera till strängvariabeln strMsg
. När den andra proceduren anropas visas innehållet i strängvariabeln strMsg
i en dialogruta.
' 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
Namnområdesomfång
Om du deklarerar ett element på modulnivå med hjälp av nyckelordet Vän eller Offentlig blir det tillgängligt för alla procedurer i hela namnområdet där elementet deklareras. Med följande ändring i föregående exempel kan strängvariabeln strMsg
refereras till med kod var som helst i namnområdet för deklarationen.
' Include this declaration at module level (not inside any procedure).
Public strMsg As String
Namnområdesomfånget innehåller kapslade namnområden. Ett element som är tillgängligt från ett namnområde är också tillgängligt från alla namnområden som är kapslade i namnområdet.
Om projektet inte innehåller några Namnområdesinstruktorär allt i projektet i samma namnområde. I det här fallet kan namnområdesomfång betraktas som projektomfång. Public
element i en modul, klass eller struktur är också tillgängliga för alla projekt som refererar till deras projekt.
Val av omfång
När du deklarerar en variabel bör du tänka på följande punkter när du väljer dess omfång.
Fördelar med lokala variabler
Lokala variabler är ett bra val för alla typer av tillfälliga beräkningar av följande skäl:
Undvikande av namnkonflikt. Lokala variabelnamn är inte konfliktkänsliga. Du kan till exempel skapa flera olika procedurer som innehåller en variabel med namnet
intTemp
. Så länge var ochintTemp
en deklareras som en lokal variabel känner varje procedur bara igen sin egen version avintTemp
. En procedur kan ändra värdet lokaltintTemp
utan att påverkaintTemp
variabler i andra procedurer.Minnesförbrukning. Lokala variabler förbrukar bara minne medan proceduren körs. Deras minne frigörs när proceduren återgår till anropskoden. Däremot förbrukar delade och statiska variabler minnesresurser tills programmet slutar köras, så använd dem bara när det behövs. Instansvariabler förbrukar minne medan deras instans fortsätter att finnas, vilket gör dem mindre effektiva än lokala variabler, men potentiellt effektivare än
Shared
ellerStatic
variabler.
Minimera omfång
När du deklarerar en variabel eller konstant är det i allmänhet bra programmeringspraxis att göra omfånget så smalt som möjligt (blockomfånget är det smalaste). Detta bidrar till att spara minne och minimerar risken för att koden felaktigt refererar till fel variabel. På samma sätt bör du deklarera en variabel som statisk endast när det är nödvändigt att bevara dess värde mellan proceduranrop.