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.

Vedi anche