Sdílet prostřednictvím


Propagace typu (Visual Basic)

Když deklarujete programovací prvek v modulu, Jazyk Visual Basic propaguje jeho obor na obor názvů obsahující modul. To se označuje jako povýšení typu.

Následující příklad ukazuje definici kostry modulu a dva členy tohoto modulu.

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

V projModulerámci , programovací prvky deklarované na úrovni modulu jsou povýšeny na projNamespace. V předchozím příkladu basicEnum a innerClass jsou povýšeny, ale numberSub nejsou, protože nejsou deklarovány na úrovni modulu.

Účinek povýšení typu

Účinek povýšení typu spočívá v tom, že řetězec kvalifikace nemusí obsahovat název modulu. Následující příklad provede dvě volání procedury v předchozím příkladu.

Sub usePromotion()
    projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
    projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub

V předchozím příkladu první volání používá kompletní řetězce kvalifikace. To ale není nutné kvůli povýšení typu. Druhé volání také přistupuje ke členům modulu bez zahrnutí projModule do řetězců kvalifikace.

Porážka typu Povýšení

Pokud obor názvů již má člena se stejným názvem jako člen modulu, povýšení typu je pro daného člena modulu poraženo. Následující příklad ukazuje definici kostry výčtu a modulu ve stejném oboru názvů.

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

V předchozím příkladu visual Basic nemůže zvýšit úroveň třídy abcthisNameSpace , protože již existuje výčet se stejným názvem na úrovni oboru názvů. Chcete-li získat přístup abcSub, je nutné použít úplný řetězec thisNamespace.thisModule.abc.abcSubkvalifikace . Třída xyz je však stále povýšena a můžete získat přístup s xyzSub kratším řetězcem thisNamespace.xyz.xyzSubkvalifikace .

Porážka povýšení typu pro částečné typy

Pokud třída nebo struktura uvnitř modulu používá částečné klíčové slovo, povýšení typu je automaticky poraženo pro danou třídu nebo strukturu, zda obor názvů má člena se stejným názvem. Další prvky v modulu mají stále nárok na povýšení typu.

Důsledky. Porážka povýšení typu částečné definice může způsobit neočekávané výsledky a dokonce chyby kompilátoru. Následující příklad ukazuje kostru částečných definic třídy, z nichž jedna je uvnitř modulu.

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

V předchozím příkladu může vývojář očekávat, že kompilátor sloučí dvě částečné definice sampleClass. Kompilátor však nepovažuje povýšení pro částečnou definici uvnitř sampleModule. V důsledku toho se pokusí zkompilovat dvě samostatné a odlišné třídy, a to jak pojmenované sampleClass , tak s různými cestami kvalifikace.

Kompilátor sloučí částečné definice pouze v případě, že jsou jejich plně kvalifikované cesty identické.

Doporučení

Následující doporučení představují dobrý postup programování.

  • Jedinečné názvy Pokud máte plnou kontrolu nad pojmenováváním programovacích prvků, je vždy vhodné používat jedinečné názvy všude. Identické názvy vyžadují dodatečnou kvalifikaci a mohou znesnadnit čtení kódu. Můžou také vést k drobným chybám a neočekávaným výsledkům.

  • Úplná kvalifikace. Při práci s moduly a dalšími prvky ve stejném oboru názvů je nejbezpečnějším přístupem vždy používat úplnou kvalifikaci pro všechny programovací prvky. Pokud je povýšení typu pro člena modulu poraženo a vy tento člen plně nekvalifikujete, můžete neúmyslně přistupovat k jinému programovacímu prvku.

Viz také