Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 projModuleworden programmeerelementen die op moduleniveau zijn gedeclareerd, gepromoveerd naar projNamespace. In het voorgaande voorbeeld worden basicEnum en innerClass gepromoveerd, maar numberSub niet, omdat het niet op moduleniveau wordt gedeclareerd.
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 projModule op te nemen in de kwalificatietekenreeksen.
Nederlaag van typenpromotie
Als de naamruimte al een lid met dezelfde naam als een modulelid bevat, wordt de type-promotie voor dat modulelid onderdrukt. 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 abcSubmoet u de volledige kwalificatietekenreeks thisNamespace.thisModule.abc.abcSubgebruiken. De klasse xyz wordt nog steeds echter gepromoveerd en kunt u toegang verkrijgen tot xyzSub met de kortere kwalificatietekenreeks thisNamespace.xyz.xyzSub.
Tegengaan van typepromotie voor gedeeltelijke typen
Als een klasse of structuur in een module het Partial trefwoord gebruikt, wordt typepromotie automatisch uitgeschakeld 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 ontkrachten van typepromotie bij een gedeeltelijke definitie kan onverwachte resultaten en zelfs compilerfouten veroorzaken. In het volgende voorbeeld ziet u gedeeltelijke definities van een klasse, waarvan er één 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 samenvoegt. 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 is uitgeschakeld voor een modulelid en u specificeert dat lid niet volledig, kunt u per ongeluk toegang krijgen tot een ander programmeerelement.