Spazi dei nomi in Visual BasicNamespaces in Visual Basic

Gli spazi dei nomi organizzano gli oggetti definiti in un assembly.Namespaces organize the objects defined in an assembly. Gli assembly possono contenere più spazi dei nomi, che a loro volta possono contenere altri spazi dei nomi.Assemblies can contain multiple namespaces, which can in turn contain other namespaces. 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.Namespaces prevent ambiguity and simplify references when using large groups of objects such as class libraries.

Ad esempio, .NET Framework.NET Framework definisce la classe ListBox nello spazio dei nomi System.Windows.Forms.For example, the .NET Framework.NET Framework defines the ListBox class in the System.Windows.Forms namespace. Il frammento di codice seguente illustra come dichiarare una variabile usando il nome completo per questa classe:The following code fragment shows how to declare a variable using the fully qualified name for this class:

Dim LBox As System.Windows.Forms.ListBox

Evitare conflitti di nomiAvoiding Name Collisions

Gli spazi dei nomi di.NET Framework.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..NET Framework.NET Framework namespaces address a problem sometimes called namespace pollution, in which the developer of a class library is hampered by the use of similar names in another library. Questi conflitti con i componenti esistenti sono talvolta denominati conflitti di nomi.These conflicts with existing components are sometimes called name collisions.

Se, ad esempio, si crea una nuova classe denominata ListBox, è possibile usarla all'interno del progetto senza qualificazione.For example, if you create a new class named ListBox, you can use it inside your project without qualification. Tuttavia, se si desidera utilizzare il .NET Framework.NET Framework ListBox classe nello stesso progetto, è necessario usare un riferimento completo per rendere univoco il riferimento.However, if you want to use the .NET Framework.NET Framework ListBox class in the same project, you must use a fully qualified reference to make the reference unique. Se il riferimento non è univoco, Visual Basic genera un errore che informa che il nome è ambiguo.If the reference is not unique, Visual Basic produces an error stating that the name is ambiguous. L'esempio di codice seguente illustra come dichiarare questi oggetti:The following code example demonstrates how to declare these objects:

' 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.The following illustration shows two namespace hierarchies, both containing an object named ListBox.

Gerarchia NamespaceNamespace Hierarchy

Per impostazione predefinita, ogni file eseguibile creato con Visual Basic contiene uno spazio dei nomi con lo stesso nome del progetto.By default, every executable file you create with Visual Basic contains a namespace with the same name as your project. 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.For example, if you define an object within a project named ListBoxProject, the executable file ListBoxProject.exe contains a namespace called ListBoxProject.

Più assembly possono usare lo stesso spazio dei nomi.Multiple assemblies can use the same namespace. Visual Basic li gestisce come un singolo set di nomi.Visual Basic treats them as a single set of names. È 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.For example, you can define classes for a namespace called SomeNameSpace in an assembly named Assemb1, and define additional classes for the same namespace from an assembly named Assemb2.

nomi completiFully Qualified Names

I nomi completi sono riferimenti a oggetti preceduti dal nome dello spazio dei nomi in cui è definito l'oggetto.Fully qualified names are object references that are prefixed with the name of the namespace in which the object is defined. È 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.You can use objects defined in other projects if you create a reference to the class (by choosing Add Reference from the Project menu) and then use the fully qualified name for the object in your code. Il frammento di codice seguente mostra come usare il nome completo per un oggetto dallo spazio dei nomi di un altro progetto:The following code fragment shows how to use the fully qualified name for an object from another project's namespace:

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.Fully qualified names prevent naming conflicts because they make it possible for the compiler to determine which object is being used. I nomi stessi, tuttavia, possono diventare lunghi e complessi.However, the names themselves can get long and cumbersome. Per evitare questo problema, è possibile usare l'istruzione Imports per definire un alias, ossia un nome abbreviato utilizzabile al posto di un nome completo.To get around this, you can use the Imports statement to define an alias—an abbreviated name you can use in place of a fully qualified name. Ad esempio, il codice seguente crea alias per due nomi completi e usa questi alias per definire due oggetti.For example, the following code example creates aliases for two fully qualified names, and uses these aliases to define two objects.

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.If you use the Imports statement without an alias, you can use all the names in that namespace without qualification, provided they are unique to the project. 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.If your project contains Imports statements for namespaces that contain items with the same name, you must fully qualify that name when you use it. Si supponga, ad esempio, che il progetto contenga le due istruzioni Imports seguenti:Suppose, for example, your project contained the following two Imports statements:

' 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 genera un errore che informa che il nome Class1 è ambiguo.If you attempt to use Class1 without fully qualifying it, Visual Basic produces an error stating that the name Class1 is ambiguous.

Istruzioni a livello di spazio dei nomiNamespace Level Statements

All'interno di uno spazio dei nomi è possibile definire elementi quali moduli, interfacce, classi, delegati, enumerazioni, strutture e altri spazi dei nomi.Within a namespace, you can define items such as modules, interfaces, classes, delegates, enumerations, structures, and other namespaces. Non è invece possibile definire elementi come proprietà, routine, variabili ed eventi a livello di spazio dei nomi.You cannot define items such as properties, procedures, variables and events at the namespace level. Questi elementi devono essere dichiarati all'interno di contenitori quali moduli, strutture o classi.These items must be declared within containers such as modules, structures, or classes.

Parola chiave Global nei nomi completiGlobal Keyword in Fully Qualified Names

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.If you have defined a nested hierarchy of namespaces, code inside that hierarchy might be blocked from accessing the System namespace of the .NET Framework. L'esempio seguente illustra una gerarchia in cui lo spazio dei nomi SpecialSpace.System blocca l'accesso a System.The following example illustrates a hierarchy in which the SpecialSpace.System namespace blocks access to 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.Int32 perché SpecialSpace.System non definisce Int32.As a result, the Visual Basic compiler cannot successfully resolve the reference to System.Int32, because SpecialSpace.System does not define Int32. Per iniziare la catena di qualificazione al livello più esterno della libreria di classi di .NET Framework è possibile usare la parola chiave Global .You can use the Global keyword to start the qualification chain at the outermost level of the .NET Framework class library. In questo modo si può specificare lo spazio dei nomi System o qualsiasi altro spazio dei nomi nella libreria di classi.This allows you to specify the System namespace or any other namespace in the class library. Questa condizione è illustrata nell'esempio seguente.The following example illustrates this.

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.You can use Global to access other root-level namespaces, such as Microsoft.VisualBasic, and any namespace associated with your project.

Parola chiave Global nelle istruzioni degli spazi dei nomiGlobal Keyword in Namespace Statements

La parola chiave Global può essere usata anche in un oggetto Namespace Statement.You can also use the Global keyword in a Namespace Statement. Ciò consente di definire uno spazio dei nomi all'esterno dello spazio dei nomi radice del progetto.This lets you define a namespace out of the root namespace of your project.

Tutti gli spazi dei nomi inclusi nel progetto sono basati sullo spazio dei nomi radice definito per il progetto.All namespaces in your project are based on the root namespace for the project. Visual Studio assegna il nome del progetto come spazio dei nomi radice predefinito per tutto il codice del progetto.Visual Studio assigns your project name as the default root namespace for all code in your project. Se, ad esempio, il progetto è denominato ConsoleApplication1, i relativi elementi di programmazione appartengono allo spazio dei nomi ConsoleApplication1.For example, if your project is named ConsoleApplication1, its programming elements belong to namespace ConsoleApplication1. Se si dichiara Namespace Magnetosphere, i riferimenti a Magnetosphere nel progetto accedono a ConsoleApplication1.Magnetosphere.If you declare Namespace Magnetosphere, references to Magnetosphere in the project will access 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.The following examples use the Global keyword to declare a namespace out of the root namespace for the project.

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.In a namespace declaration, Global cannot be nested in another namespace.

È possibile usare la pagina dell'applicazione, creazione progetti (Visual Basic) per visualizzare e modificare le radice Namespace del progetto.You can use the Application Page, Project Designer (Visual Basic) to view and modify the Root Namespace of the project. Per i nuovi progetti, come spazio dei nomi radice predefinito viene usato il nome del progetto.For new projects, the Root Namespace defaults to the project name. 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.To cause Global to be the top-level namespace, you can clear the Root Namespace entry so that the box is empty. La cancellazione della voce Spazio dei nomi radice elimina la necessità di usare la parola chiave Global nelle dichiarazioni degli spazi dei nomi.Clearing Root Namespace removes the need for the Global keyword in namespace declarations.

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.If a Namespace statement declares a name that is also a namespace in the .NET Framework, the .NET Framework namespace becomes unavailable if the Global keyword is not used in a fully qualified name. Per abilitare l'accesso allo spazio dei nomi di .NET Framework senza usare la parola chiave Global , è possibile includere Global nell'istruzione Namespace .To enable access to that .NET Framework namespace without using the Global keyword, you can include the Global keyword in the Namespace statement.

L'esempio seguente mostra la dichiarazione dello spazio dei nomi Global con la parola chiave System.Text .The following example has the Global keyword in the System.Text namespace declaration.

Se Global non è presente nella dichiarazione dello spazio dei nomi, StringBuilder non è accessibile, a meno che non si specifichi Global.System.Text.StringBuilder.If the Global keyword was not present in the namespace declaration, StringBuilder could not be accessed without specifying 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 .For a project named ConsoleApplication1, references to System.Text would access ConsoleApplication1.System.Text if the Global keyword was not used.

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 ancheSee also