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
:
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 Assemb1
e 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