Sdílet prostřednictvím


Zvýšení úrovně typu (Visual Basic)

Když deklarujete programovací prvek v modulu, Visual Basic zvyšuje jeho obor na obor názvů obsahující modul. To se označuje jako typová propagace.

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 typového povýšení 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á úplné kvalifikační řetězce. To ale není nutné kvůli povýšení typu. Druhé volání také přistupuje ke členům modulu bez zahrnutí projModule do kvalifikačních řetězců.

Porážka typu Povýšení

Pokud obor názvů již má člena se stejným názvem jako člen modulu, podpora typu člena modulu není možná. 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 nemůže Visual Basic povýšit třídu abc na thisNameSpace, protože na úrovni oboru názvů již existuje výčet se stejným názvem. Chcete-li získat přístup abcSub, musíte použít úplný řetězec kvalifikace thisNamespace.thisModule.abc.abcSub. Třída xyz je však stále povýšena a k xyzSub můžete přistupovat pomocí kratšího kvalifikačního řetězce thisNamespace.xyz.xyzSub.

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

Pokud třída nebo struktura uvnitř modulu používá klíčové slovo Partial, povýšení typu je automaticky zrušeno pro danou třídu nebo strukturu, bez ohledu na to, zda obor názvů obsahuje č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 pro částečnou definici uvnitř sampleModule nezvažuje povýšení. 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 potlačeno povyšování typu pro člena modulu a vy člena plně nespecifikujete, můžete nechtěně přistupovat k jinému programovacímu prvku.

Viz také