Dela via


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

  • For [Each] och Next

  • If och End If

  • Select och End Select

  • SyncLock och End SyncLock

  • Try och End Try

  • While och End While

  • With och End 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 och intTemp en deklareras som en lokal variabel känner varje procedur bara igen sin egen version av intTemp. En procedur kan ändra värdet lokalt intTemp utan att påverka intTemp 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 eller Static 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.

Se även