Condividi tramite


Promozione dei tipi (Visual Basic)

Quando si dichiara un elemento di programmazione in un modulo, il suo ambito viene promosso da Visual Basic allo spazio dei nomi che contiene il modulo. Questa operazione è nota come promozione del tipo.

L'esempio seguente illustra una definizione scheletra 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

All'interno di projModule, gli elementi dichiarati a livello di modulo vengono promossi a projNamespace. Nell'esempio basicEnum precedente e innerClass vengono alzati di livello, ma numberSub non, perché non sono dichiarati a livello di modulo.

Effetto dell'innalzamento di livello

L'effetto dell'innalzamento di livello è che una stringa di qualificazione non deve includere il nome del modulo. Nell'esempio seguente si effettuano due chiamate alla procedura nell'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 grazie alla promozione di tipo. La seconda chiamata accede anche ai membri del modulo senza includere projModule nelle stringhe di qualificazione.

Sconfitta della promozione di tipo

Se nello spazio dei nomi c'è già un membro con lo stesso nome di un membro del modulo, la promozione del tipo viene annullata per quel membro del modulo. Nell'esempio seguente viene illustrata una definizione scheletra di un'enumerazione e di un modulo all'interno dello 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ò alzare di livello la classe abc perché thisNameSpace esiste già un'enumerazione con lo stesso nome a livello di spazio dei nomi. Per accedere a abcSub, è necessario usare la stringa thisNamespace.thisModule.abc.abcSubdi qualificazione completa . Tuttavia, la classe xyz è ancora promossa ed è possibile accedere a xyzSub con la più breve stringa di qualificazione thisNamespace.xyz.xyzSub.

Sconfitta della promozione del tipo per i tipi parziali

Se una classe o una struttura all'interno di un modulo usa la parola chiave Partial , l'innalzamento di tipo viene automaticamente sconfitto per tale classe o struttura, indipendentemente dal fatto che lo spazio dei nomi abbia o meno un membro con lo stesso nome. Altri elementi del modulo sono ancora idonei per l'avanzamento del tipo.

Conseguenze. La sconfitta della promozione del tipo di una definizione parziale può causare risultati imprevisti e persino errori del compilatore. Nell'esempio seguente viene illustrato lo scheletro di definizioni parziali 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 unisce le due definizioni parziali di sampleClass. Tuttavia, il compilatore non considera l'innalzamento di livello per la definizione parziale all'interno di sampleModule. Di conseguenza, tenta di compilare due classi separate e distinte, entrambe denominate sampleClass ma con percorsi di qualificazione diversi.

Il compilatore unisce definizioni parziali solo quando i percorsi completi sono identici.

Consigli

Le raccomandazioni seguenti rappresentano una buona procedura di programmazione.

  • Nomi univoci. Quando si ha il controllo completo sulla denominazione degli elementi di programmazione, è sempre consigliabile usare nomi univoci ovunque. I nomi identici richiedono una qualifica aggiuntiva e possono rendere il codice più difficile da leggere. Possono anche causare errori sottili e risultati imprevisti.

  • Qualifica completa. Quando si usano moduli e altri elementi nello stesso spazio dei nomi, l'approccio più sicuro consiste nell'usare sempre la qualifica completa per tutti gli elementi di programmazione. Se la promozione del tipo viene bloccata per un membro del modulo e non si qualifica completamente quel membro, si potrebbe inavvertitamente accedere a un diverso elemento di programmazione.

Vedere anche