Spazi dei nomi in Visual Basic

Gli spazi dei nomi organizzano gli oggetti definiti in un assembly. Gli assembly possono contenere più spazi dei nomi, che a loro volta possono contenere altri spazi dei nomi. Gli spazi dei nomi consentono di evitare problemi di ambiguità e di semplificare i riferimenti quando si usano gruppi di oggetti di grandi dimensioni, ad esempio librerie di classi.

Ad esempio, .NET Framework definisce la classe ListBox nello spazio dei nomi System.Windows.Forms. Il frammento di codice seguente illustra come dichiarare una variabile usando il nome completo per questa classe:

Dim LBox As System.Windows.Forms.ListBox

Evitare conflitti di nomi

Gli spazi dei nomi .NET Framework consentono di risolvere un problema, talvolta chiamato inquinamento dello spazio dei nomi, per cui lo sviluppatore di una libreria di classi incontra difficoltà a causa dell'uso di nomi simili in un'altra libreria. Questi conflitti con i componenti esistenti sono talvolta denominati conflitti di nomi.

Se, ad esempio, si crea una nuova classe denominata ListBox, è possibile usarla all'interno del progetto senza qualificazione. Tuttavia, se si vuole usare la classe ListBox di .NET Framework nello stesso progetto, è necessario usare un riferimento completo per rendere univoco il riferimento. Se il riferimento non è univoco, Visual Basic genera un errore per informare che il nome è ambiguo. L'esempio di codice seguente illustra come dichiarare questi oggetti:

' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

La figura seguente mostra due gerarchie di spazio dei nomi che contengono entrambe un oggetto denominato ListBox:

Screenshot that shows two namespace hierarchies.

Per impostazione predefinita, ogni file eseguibile creato con Visual Basic contiene uno spazio dei nomi con lo stesso nome del progetto. Se, ad esempio, si definisce un oggetto all'interno di un progetto denominato ListBoxProject, il file eseguibile ListBoxProject.exe conterrà uno spazio dei nomi chiamato ListBoxProject.

Più assembly possono usare lo stesso spazio dei nomi. Visual Basic considera tali assembly come un singolo set di nomi. È ad esempio possibile definire classi per uno spazio dei nomi chiamato SomeNameSpace in un assembly denominato Assemb1e altre classi per lo stesso spazio dei nomi da un assembly denominato Assemb2.

nomi completi

I nomi completi sono riferimenti a oggetti preceduti dal nome dello spazio dei nomi in cui è definito l'oggetto. È possibile usare gli oggetti definiti in altri progetti se si crea un riferimento alla classe (scegliendo Aggiungi riferimento dal menu Progetto ) e quindi usare il nome completo per l'oggetto nel codice. Il frammento di codice seguente mostra come usare il nome completo per un oggetto dallo spazio dei nomi di un altro progetto:

Dim LBC As New ListBoxProject.Form1.ListBox

I nomi completi impediscono i conflitti di denominazione perché consentono al compilatore di determinare quale oggetto viene usato. I nomi stessi, tuttavia, possono diventare lunghi e complessi. Per evitare questo problema, è possibile usare l'istruzione Imports per definire un alias, ossia un nome abbreviato utilizzabile al posto di un nome completo. Ad esempio, il codice seguente crea alias per due nomi completi e usa questi alias per definire due oggetti.

Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox

Se si usa l'istruzione Imports senza un alias, è possibile usare tutti i nomi dello spazio dei nomi senza qualificazione, a condizione che siano univoci per il progetto. Se il progetto contiene istruzioni Imports per gli spazi dei nomi che contengono elementi con lo stesso nome, quando si usa il nome è necessario definirlo in modo completo. Si supponga, ad esempio, che il progetto contenga le due istruzioni Imports seguenti:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Se si prova a usare Class1 senza definirlo in modo completo, Visual Basic genererà un errore per segnalare che il nome Class1 è ambiguo.

Istruzioni a livello di spazio dei nomi

All'interno di uno spazio dei nomi è possibile definire elementi quali moduli, interfacce, classi, delegati, enumerazioni, strutture e altri spazi dei nomi. Non è invece possibile definire elementi come proprietà, routine, variabili ed eventi a livello di spazio dei nomi. Questi elementi devono essere dichiarati all'interno di contenitori quali moduli, strutture o classi.

Parola chiave Global nei nomi completi

Se è stata definita una gerarchia annidata di spazi dei nomi, è possibile che per il codice interno alla gerarchia venga bloccato l'accesso allo spazio dei nomi System di .NET Framework. L'esempio seguente illustra una gerarchia in cui lo spazio dei nomi SpecialSpace.System blocca l'accesso a System.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As System.Int32  
                Dim n As System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Di conseguenza, il compilatore di Visual Basic non è in grado di risolvere il riferimento a System.Int32perché SpecialSpace.System non definisce Int32. Per iniziare la catena di qualificazione al livello più esterno della libreria di classi di .NET Framework è possibile usare la parola chiave Global . In questo modo si può specificare lo spazio dei nomi System o qualsiasi altro spazio dei nomi nella libreria di classi. Ciò è illustrato nell'esempio seguente.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As Global.System.Int32  
                Dim n As Global.System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Usando Global è possibile accedere ad altri spazi dei nomi a livello di radice, ad esempio Microsoft.VisualBasic, e a qualsiasi spazio dei nomi associato al progetto.

Parola chiave Global nelle istruzioni degli spazi dei nomi

La parola chiave Global può essere usata anche in un oggetto Namespace Statement. Ciò consente di definire uno spazio dei nomi all'esterno dello spazio dei nomi radice del progetto.

Tutti gli spazi dei nomi inclusi nel progetto sono basati sullo spazio dei nomi radice definito per il progetto. Visual Studio assegna il nome del progetto come spazio dei nomi radice predefinito per tutto il codice del progetto. Se, ad esempio, il progetto è denominato ConsoleApplication1, i relativi elementi di programmazione appartengono allo spazio dei nomi ConsoleApplication1. Se si dichiara Namespace Magnetosphere, i riferimenti a Magnetosphere nel progetto accedono a ConsoleApplication1.Magnetosphere.

Negli esempi seguenti viene usata la parola chiave Global per dichiarare uno spazio dei nomi all'esterno dello spazio dei nomi radice per il progetto.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

In una dichiarazione dello spazio dei nomi la parola chiave Global non può essere annidata in un altro spazio dei nomi.

È possibile usare Application Page, Project Designer (Visual Basic) per visualizzare e modificare lo spazio dei nomi radice del progetto. Per i nuovi progetti, come spazio dei nomi radice predefinito viene usato il nome del progetto. Per impostare Global come spazio dei nomi di primo livello, è possibile cancellare la voce Spazio dei nomi radice in modo da lasciare vuota la casella. La cancellazione della voce Spazio dei nomi radice elimina la necessità di usare la parola chiave Global nelle dichiarazioni degli spazi dei nomi.

Se un'istruzione Namespace dichiara un nome che è anche uno spazio dei nomi in .NET Framework e la parola chiave Global non viene usata in un nome completo, lo spazio dei nomi di .NET Framework non sarà più disponibile. Per abilitare l'accesso allo spazio dei nomi di .NET Framework senza usare la parola chiave Global , è possibile includere Global nell'istruzione Namespace .

L'esempio seguente mostra la dichiarazione dello spazio dei nomi Global con la parola chiave System.Text .

Se Global non è presente nella dichiarazione dello spazio dei nomi, StringBuilder non è accessibile, a meno che non si specifichi Global.System.Text.StringBuilder. Per un progetto denominato ConsoleApplication1, i riferimenti a System.Text accedono a ConsoleApplication1.System.Text se non viene usata la parola chiave Global .

Module Module1
    Sub Main()
        Dim encoding As New System.Text.TitanEncoding

        ' If the namespace defined below is System.Text
        ' instead of Global.System.Text, then this statement
        ' causes a compile-time error.
        Dim sb As New System.Text.StringBuilder
    End Sub
End Module

Namespace Global.System.Text
    Class TitanEncoding

    End Class
End Namespace

Vedi anche