Typhöjning (Visual Basic)
När du deklarerar ett programmeringselement i en modul höjer Visual Basic upp dess omfång till det namnområde som innehåller modulen. Detta kallas för typhöjning.
I följande exempel visas en skelettdefinition av en modul och två medlemmar i modulen.
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Shared Sub numberSub(ByVal firstArg As Integer)
End Sub
End Class
End Module
End Namespace
Inom projModule
befordras programmeringselement som deklarerats på modulnivå till projNamespace
. I föregående exempel basicEnum
befordras och innerClass
, men numberSub
inte, eftersom det inte deklareras på modulnivå.
Effekt av typhöjning
Effekten av typhöjning är att en kvalificeringssträng inte behöver inkludera modulnamnet. I följande exempel görs två anrop till proceduren i föregående exempel.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
I föregående exempel använder det första anropet fullständiga kvalificeringssträngar. Detta är dock inte nödvändigt på grund av typhöjning. Det andra anropet kommer också åt modulens medlemmar utan att inkludera projModule
i kvalifikationssträngarna.
Befordring av typnederlag
Om namnområdet redan har en medlem med samma namn som en modulmedlem, så besegras typhöjningen för modulmedlemmen. I följande exempel visas en skelettdefinition av en uppräkning och en modul inom samma namnområde.
Namespace thisNamespace
Public Enum abc
first = 1
second
End Enum
Module thisModule
Public Class abc
Public Sub abcSub()
End Sub
End Class
Public Class xyz
Public Sub xyzSub()
End Sub
End Class
End Module
End Namespace
I föregående exempel kan Visual Basic inte höja upp klassen abc
till thisNameSpace
eftersom det redan finns en uppräkning med samma namn på namnområdesnivå. För att få åtkomst abcSub
måste du använda den fullständiga kvalificeringssträngen thisNamespace.thisModule.abc.abcSub
. Klassen xyz
har dock fortfarande befordrats och du kan komma åt xyzSub
med den kortare kvalifikationssträngen thisNamespace.xyz.xyzSub
.
Förlust av typhöjning för partiella typer
Om en klass eller struktur i en modul använder nyckelordet Partial (Partiell) besegras typhöjningen automatiskt för den klassen eller strukturen, oavsett om namnområdet har en medlem med samma namn eller inte. Andra element i modulen är fortfarande berättigade till typhöjning.
Konsekvenser. Överflyttning av typ av en partiell definition kan orsaka oväntade resultat och till och med kompilatorfel. I följande exempel visas partiella definitioner av en klass, varav en finns i en modul.
Namespace sampleNamespace
Partial Public Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
I föregående exempel kan utvecklaren förvänta sig att kompilatorn sammanfogar de två partiella definitionerna av sampleClass
. Kompilatorn överväger dock inte befordran för den partiella definitionen i sampleModule
. Därför försöker den kompilera två separata och distinkta klasser, båda namngivna sampleClass
men med olika kvalificeringsvägar.
Kompilatorn sammanfogar endast partiella definitioner när deras fullständigt kvalificerade sökvägar är identiska.
Rekommendationer
Följande rekommendationer representerar god programmeringspraxis.
Unika namn. När du har fullständig kontroll över namngivning av programmeringselement är det alltid en bra idé att använda unika namn överallt. Identiska namn kräver extra kvalificering och kan göra koden svårare att läsa. De kan också leda till subtila fel och oväntade resultat.
Fullständig kvalificering. När du arbetar med moduler och andra element i samma namnområde är den säkraste metoden att alltid använda fullständig kvalificering för alla programmeringselement. Om typhöjningen har besegrats för en modulmedlem och du inte kvalificerar den medlemmen fullt ut kan du oavsiktligt komma åt ett annat programmeringselement.