Typepromotie (Visual Basic)
Wanneer u een programmeerelement in een module declareert, breidt Visual Basic het bereik ervan uit naar de naamruimte die de module bevat. Dit wordt typepromotie genoemd.
In het volgende voorbeeld ziet u een basisdefinitie van een module en twee leden van die module.
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
Binnen projModule
worden programmeerelementen die op moduleniveau zijn gedeclareerd, gepromoveerd naar projNamespace
. In het voorgaande voorbeeld en basicEnum
innerClass
worden gepromoveerd, maar numberSub
niet, omdat deze niet wordt gedeclareerd op moduleniveau.
Effect van typepromotie
Het effect van typepromotie is dat een kwalificatietekenreeks de modulenaam niet hoeft op te nemen. In het volgende voorbeeld worden twee aanroepen gedaan naar de procedure in het voorgaande voorbeeld.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
In het voorgaande voorbeeld gebruikt de eerste aanroep volledige kwalificatietekenreeksen. Dit is echter niet nodig vanwege type promotie. De tweede aanroep heeft ook toegang tot de leden van de module zonder de kwalificatietekenreeksen op te geven projModule
.
Verslaan van type promotie
Als de naamruimte al een lid met dezelfde naam heeft als een modulelid, wordt de niveauverhoging voor dat modulelid verslagen. In het volgende voorbeeld ziet u een basisdefinitie van een opsomming en een module binnen dezelfde naamruimte.
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
In het voorgaande voorbeeld kan Visual Basic de klasse abc
niet promoveren naar thisNameSpace
omdat er al een opsomming met dezelfde naam op naamruimteniveau is. Voor toegang abcSub
moet u de volledige kwalificatietekenreeks thisNamespace.thisModule.abc.abcSub
gebruiken. De klasse xyz
wordt echter nog steeds gepromoveerd en u kunt toegang krijgen xyzSub
met de kortere kwalificatietekenreeks thisNamespace.xyz.xyzSub
.
Niveauverhoging voor gedeeltelijke typen verslaan
Als een klasse of structuur in een module gebruikmaakt van het trefwoord Gedeeltelijk , wordt typepromotie automatisch verslagen voor die klasse of structuur, ongeacht of de naamruimte een lid met dezelfde naam heeft. Andere elementen in de module komen nog steeds in aanmerking voor typepromotie.
Gevolgen. Het verslaan van typepromotie van een gedeeltelijke definitie kan onverwachte resultaten en zelfs compilerfouten veroorzaken. In het volgende voorbeeld ziet u gedeeltelijke definities van een klasse die zich in een module bevindt.
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
In het voorgaande voorbeeld kan de ontwikkelaar verwachten dat de compiler de twee gedeeltelijke definities van sampleClass
. De compiler beschouwt echter geen promotie voor de gedeeltelijke definitie binnen sampleModule
. Als gevolg hiervan probeert het twee afzonderlijke en afzonderlijke klassen te compileren, beide benoemd sampleClass
maar met verschillende kwalificatiepaden.
De compiler voegt alleen gedeeltelijke definities samen wanneer hun volledig gekwalificeerde paden identiek zijn.
Aanbevelingen
De volgende aanbevelingen vormen een goede programmeerpraktijk.
Unieke namen. Wanneer u volledige controle hebt over de naamgeving van programmeerelementen, is het altijd een goed idee om overal unieke namen te gebruiken. Identieke namen vereisen extra kwalificatie en kunnen uw code moeilijker te lezen maken. Ze kunnen ook leiden tot subtiele fouten en onverwachte resultaten.
Volledige kwalificatie. Wanneer u met modules en andere elementen in dezelfde naamruimte werkt, is de veiligste benadering altijd volledige kwalificatie te gebruiken voor alle programmeerelementen. Als typepromotie wordt verslagen voor een modulelid en u niet volledig in aanmerking komt voor dat lid, kunt u per ongeluk toegang krijgen tot een ander programmeerelement.