Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.