Promozione tipo (Visual Basic)
Quando si dichiara un elemento di programmazione in un modulo, Visual Basic ne promuove l'ambito allo spazio dei nomi che contiene il modulo. Questa operazione è nota come promozione tipo.
L'esempio seguente illustra una definizione di struttura di un modulo e due membri di tale modulo.
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
In projModule
gli elementi di programmazione dichiarati a livello di modulo vengono promossi a projNamespace
. Nell'esempio precedente, basicEnum
e innerClass
vengono promossi, ma non numberSub
perché non viene dichiarato a livello di modulo.
Effetto della promozione tipo
Per effetto della promozione tipo una stringa di qualificazione non deve includere il nome del modulo. Nell'esempio seguente vengono effettuate due chiamate alla routine dell'esempio precedente.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
Nell'esempio precedente la prima chiamata usa stringhe di qualificazione complete. Tuttavia, questo non è necessario in virtù della promozione tipo. La seconda chiamata accede anche ai membri del modulo senza includere projModule
nelle stringhe di qualificazione.
Annullamento della promozione tipo
Se lo spazio dei nomi include già un membro con lo stesso nome di un membro del modulo, la promozione tipo viene annullata per tale membro del modulo. Nell'esempio seguente viene illustrata una definizione di struttura di un'enumerazione e di un modulo nello stesso spazio dei nomi.
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
Nell'esempio precedente Visual Basic non può promuovere la classe abc
a thisNameSpace
perché esiste già un'enumerazione con lo stesso nome a livello di spazio dei nomi. Per accedere a abcSub
, è necessario usare la stringa di qualificazione completa thisNamespace.thisModule.abc.abcSub
. Tuttavia, la classe xyz
è ancora promossa ed è possibile accedere a xyzSub
con la stringa di qualificazione più breve thisNamespace.xyz.xyzSub
.
Annullamento della promozione tipo per tipi parziali
Se una classe o una struttura all'interno di un modulo usa la parola chiave Partial, la promozione tipo viene automaticamente annullata per tale classe o struttura, indipendentemente dal fatto che lo spazio dei nomi includa o meno un membro con lo stesso nome. Altri elementi del modulo sono ancora idonei per la promozione tipo.
Conseguenze. L'annullamento della promozione tipo di una definizione parziale può generare risultati imprevisti e persino errori del compilatore. Nell'esempio seguente vengono illustrate le definizioni parziali della struttura di una classe, una delle quali si trova all'interno di un modulo.
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
Nell'esempio precedente lo sviluppatore potrebbe aspettarsi che il compilatore unisca le due definizioni parziali di sampleClass
. Tuttavia, il compilatore non tiene in considerazione la promozione per la definizione parziale all'interno di sampleModule
. Di conseguenza, prova a compilare due classi separate e distinte, entrambe denominate sampleClass
ma con percorsi di qualificazione diversi.
Il compilatore unisce le definizioni parziali solo se i relativi percorsi completi sono identici.
Consigli
Le raccomandazioni seguenti rappresentano una buona pratica di programmazione.
Nomi univoci. Quando si ha il controllo completo sull'assegnazione dei nomi degli elementi di programmazione, è sempre consigliabile usare nomi univoci ovunque. Nomi identici richiedono una qualifica aggiuntiva e possono rendere più difficoltosa la lettura del codice. Possono anche causare errori impercettibili e risultati imprevisti.
Qualificazione completa. Quando si usano moduli e altri elementi nello stesso spazio dei nomi, l'approccio più sicuro consiste nell'usare sempre la qualificazione completa per tutti gli elementi di programmazione. Se la promozione tipo viene annullata per un membro del modulo e non si esegue la qualificazione completa di tale membro, si potrebbe accedere inavvertitamente a un elemento di programmazione diverso.