Condividi tramite


Namespace in Visual Basic

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

Ad esempio, il framework .NET 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 risolivano un problema noto a volte come inquinamento dello spazio dei nomi, in cui lo sviluppatore di una libreria di classi è ostacolato dall'uso di nomi simili in un'altra libreria. Questi conflitti con i componenti esistenti sono talvolta denominati conflitti di nomi.

Ad esempio, se si crea una nuova classe denominata ListBox, è possibile usarla all'interno del progetto senza qualifica. Tuttavia, se si vuole usare la classe .NET Framework ListBox nello stesso progetto, è necessario usare un riferimento completo per rendere univoco il riferimento. Se il riferimento non è univoco, Visual Basic genera un errore che indica che il nome è ambiguo. Nell'esempio di codice seguente viene illustrato 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 dello spazio dei nomi, entrambe contenenti un oggetto denominato ListBox:

Screenshot che contiene due gerarchie di namespace.

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

Più assembly possono usare lo stesso spazio dei nomi. Visual Basic li considera come un singolo set di nomi. Ad esempio, è possibile definire classi per uno spazio dei nomi denominato SomeNameSpace in un assembly denominato Assemb1e definire classi aggiuntive per lo stesso spazio dei nomi da un assembly denominato Assemb2.

Nomi completamente qualificati

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 dello spazio dei nomi di un altro progetto:

Dim LBC As New ListBoxProject.Form1.ListBox

I nomi completi impediscono conflitti di denominazione perché consentono al compilatore di determinare quale oggetto viene usato. Tuttavia, i nomi stessi possono diventare lunghi e complicati. Per aggirare questo problema, è possibile usare l'istruzione Imports per definire un alias, ovvero un nome abbreviato che è possibile usare al posto di un nome completo. L'esempio di codice seguente, ad esempio, 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 utilizza l'istruzione Imports senza alias, è possibile utilizzare tutti i nomi in tale spazio dei nomi senza qualificazione, purché siano univoci per il progetto. Se il progetto contiene Imports istruzioni per i namespace che contengono elementi con lo stesso nome, è necessario qualificare completamente quel nome quando lo si utilizza. Supponiamo, ad esempio, che il tuo progetto contenga le seguenti due istruzioni Imports:

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

Se si tenta di usare Class1 senza qualificarla completamente, Visual Basic genera un errore che indica che il nome Class1 è ambiguo.

Istruzioni a livello di spazio dei nomi

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

Parola chiave globale nei nomi completamente qualificati

Se è stata definita una gerarchia annidata di spazi dei nomi, il codice all'interno di tale gerarchia potrebbe essere bloccato dall'accesso allo System spazio dei nomi di .NET Framework. Nell'esempio seguente viene illustrata 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 Visual Basic non riesce a risolvere correttamente il riferimento a System.Int32perché SpecialSpace.System non definisce Int32. È possibile usare la Global parola chiave per avviare la catena di qualificazione al livello più esterno della libreria di classi .NET Framework. In questo modo è possibile specificare lo System spazio dei nomi o qualsiasi altro spazio dei nomi nella libreria di classi. Nell'esempio seguente viene illustrato questo.

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  

È possibile usare Global per accedere ad altri spazi dei nomi a livello radice, ad esempio Microsoft.VisualBasice a qualsiasi spazio dei nomi associato al progetto.

Parola chiave 'Global' nelle dichiarazioni di spazio dei nomi

È anche possibile usare la Global parola chiave in un'istruzione namespace. In questo modo è possibile definire uno spazio dei nomi esterno allo spazio dei nomi radice del progetto.

Tutti gli spazi dei nomi nel progetto si basano sullo spazio dei nomi principale del progetto. Visual Studio assegna il nome del progetto come spazio dei nomi principale predefinito per tutto il codice del progetto. Ad esempio, se 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 accederanno a ConsoleApplication1.Magnetosphere.

Negli esempi seguenti viene usata la Global parola chiave per dichiarare uno spazio dei nomi al di fuori dello spazio radice del progetto.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

In una dichiarazione di spazio dei nomi, Global non può essere annidato in un altro spazio dei nomi.

È possibile utilizzare la Pagina Applicazione, Progettazione Progetti (Visual Basic) per visualizzare e modificare il Namespace Radice del progetto. Per i nuovi progetti, per impostazione predefinita lo spazio dei nomi radice è il nome del progetto. Affinché Global diventi lo spazio dei nomi di primo livello, è possibile cancellare la voce Spazio dei nomi radice in modo che la casella sia vuota. La cancellazione del spazio dei nomi radice elimina la necessità di includere la parola chiave Global nelle dichiarazioni dello spazio dei nomi.

Se un'istruzione Namespace dichiara un nome che è anche uno spazio dei nomi in .NET Framework, lo spazio dei nomi .NET Framework diventa non disponibile se la Global parola chiave non viene usata in un nome completo. Per abilitare l'accesso a tale spazio dei nomi .NET Framework senza usare la Global parola chiave , è possibile includere la Global parola chiave nell'istruzione Namespace .

Nell'esempio seguente è presente la Global parola chiave nella dichiarazione dello System.Text spazio dei nomi.

Se la Global parola chiave non è presente nella dichiarazione dello spazio dei nomi, StringBuilder non è possibile accedere senza specificare Global.System.Text.StringBuilder. Per un progetto denominato ConsoleApplication1, i riferimenti a System.Text accederebbero ConsoleApplication1.System.Text se la Global parola chiave non è stata usata.

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

Vedere anche