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 en basicEnuminnerClass 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 abcSubmoet u de volledige kwalificatietekenreeks thisNamespace.thisModule.abc.abcSubgebruiken. 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.

Zie ook