Delen via


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 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.

Zie ook