Anvisningar: Dölj en variabel med samma namn som din variabel (Visual Basic)
Du kan dölja en variabel genom att skugga den, dvs. genom att omdefiniera den med en variabel med samma namn. Du kan skugga variabeln som du vill dölja på två sätt:
Skuggning genom omfång. Du kan skugga den genom omfånget genom att redeclarera den i en underregion i regionen som innehåller variabeln som du vill dölja.
Skuggning genom arv. Om variabeln som du vill dölja definieras på klassnivå kan du skugga den genom arv genom att redeclara den med nyckelordet Skuggor i en härledd klass.
Två sätt att dölja en variabel
Så här döljer du en variabel genom att skugga den genom omfång
Fastställ den region som definierar den variabel som du vill dölja och fastställa en underregion där du vill omdefiniera den med din variabel.
Variabelns region Tillåten underregion för omdefiniering Modul En klass i modulen Klass En underklass i klassen
En procedur inom klassenDu kan inte omdefiniera en procedurvariabel i ett block inom den proceduren, till exempel i en
If
...End If
konstruktion eller enFor
loop.Skapa underregionen om den inte redan finns.
I underregionen skriver du en dim-instruktion som deklarerar skuggningsvariabeln.
När kod i underregionen refererar till variabelnamnet löser kompilatorn referensen till skuggvariabeln.
I följande exempel visas skuggning genom omfång samt en referens som kringgår skuggningen.
Module shadowByScope ' The following statement declares num as a module-level variable. Public num As Integer Sub show() ' The following statement declares num as a local variable. Dim num As Integer ' The following statement sets the value of the local variable. num = 2 ' The following statement displays the module-level variable. MsgBox(CStr(shadowByScope.num)) End Sub Sub useModuleLevelNum() ' The following statement sets the value of the module-level variable. num = 1 show() End Sub End Module
I föregående exempel deklareras variabeln
num
både på modulnivå och på procedurnivå (i procedurenshow
). Den lokala variabelnnum
skuggar variabelnnum
på modulnivå ishow
, så den lokala variabeln är inställd på 2. Det finns dock ingen lokal variabel att skugganum
i procedurenuseModuleLevelNum
.useModuleLevelNum
Därför anger värdet för modulnivåvariabeln till 1.Anropet
MsgBox
inutishow
kringgår skuggningsmekanismen genom att kvalificeranum
med modulnamnet. Därför visas variabeln på modulnivå i stället för den lokala variabeln.
Så här döljer du en variabel genom att skugga den genom arv
Kontrollera att variabeln som du vill dölja deklareras i en klass och på klassnivå (utanför valfri procedur). Annars kan du inte skugga det genom arv.
Definiera en klass som härleds från variabelns klass om den inte redan finns.
I den härledda klassen skriver du en
Dim
instruktion som deklarerar din variabel. Inkludera nyckelordet Skuggor i deklarationen.När kod i den härledda klassen refererar till variabelnamnet löser kompilatorn referensen till variabeln.
I följande exempel visas skuggning genom arv. Den gör två referenser, en som kommer åt skuggvariabeln och en som kringgår skuggningen.
Public Class shadowBaseClass Public shadowString As String = "This is the base class string." End Class Public Class shadowDerivedClass Inherits shadowBaseClass Public Shadows shadowString As String = "This is the derived class string." Public Sub showStrings() Dim s As String = "Unqualified shadowString: " & shadowString & vbCrLf & "MyBase.shadowString: " & MyBase.shadowString MsgBox(s) End Sub End Class
Föregående exempel deklarerar variabeln
shadowString
i basklassen och skuggar den i den härledda klassen. ProcedurenshowStrings
i den härledda klassen visar skuggningsversionen av strängen när namnetshadowString
inte är kvalificerat. Den visar sedan den skuggade versionen närshadowString
den är kvalificerad med nyckelordetMyBase
.
Robust programmering
Skuggning introducerar mer än en version av en variabel med samma namn. När en kodsats refererar till variabelnamnet beror den version som kompilatorn löser referensen till på faktorer som platsen för kodsatsen och förekomsten av en kvalificerande sträng. Detta kan öka risken för att referera till en oavsiktlig version av en skuggad variabel. Du kan minska den risken genom att helt kvalificera alla referenser till en skuggad variabel.