Utilizzo degli spazi dei nomi (Guida per programmatori C#)

Gli spazi dei nomi vengono ampiamente utilizzati all'interno dei programmi C# in due modi. In primo luogo, vengono utilizzati in .NET Framework per organizzare le numerose classi disponibili. In secondo luogo, nei progetti di programmazione di grandi dimensioni la dichiarazione di spazi dei nomi consente di controllare l'ambito dei nomi di classi e metodi.

Accesso agli spazi dei nomi

La maggior parte delle applicazioni C# inizia con una sezione di direttive using. In questa sezione sono elencati gli spazi dei nomi che verranno utilizzati di frequente dall'applicazione, evitando al programmatore di specificare un nome completo ogni volta che viene utilizzato un metodo incluso in uno di questi spazi.

Ad esempio, includendo la riga:

using System;

all'inizio di un programma, il programmatore potrà utilizzare il codice:

Console.WriteLine("Hello, World!");

anziché:

System.Console.WriteLine("Hello, World!");

Alias degli spazi dei nomi

La direttiva Direttiva using (Riferimenti per C#) può essere utilizzata anche per creare un alias per uno spazio dei nomi. Se ad esempio si utilizza uno spazio dei nomi scritto in precedenza che contiene spazi dei nomi annidati, è possibile dichiarare un alias per fare riferimento in modo rapido a uno spazio in particolare, come illustrato nell'esempio riportato di seguito:

using Co = Company.Proj.Nested;  // define an alias to represent a namespace

Utilizzo degli spazi dei nomi per controllare l'ambito

La parola chiave namespace viene utilizzata per dichiarare un ambito. La possibilità di creare ambiti nel progetto consente di organizzare il codice e di creare tipi univoci globali. Nell'esempio riportato di seguito viene definita una classe denominata SampleClass in due spazi dei nomi, l'uno annidato all'interno dell'altro. Per identificare il metodo che verrà chiamato, viene utilizzato l'. Operatore (Riferimenti per C#).

namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine(
              "SampleMethod inside SampleNamespace");
        }
    }

    // Create a nested namespace, and define another class.
    namespace NestedNamespace
    {
        class SampleClass
        {
            public void SampleMethod()
            {
                System.Console.WriteLine(
                  "SampleMethod inside NestedNamespace");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Displays "SampleMethod inside SampleNamespace."
            SampleClass outer = new SampleClass();
            outer.SampleMethod();

            // Displays "SampleMethod inside SampleNamespace."
            SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass();
            outer2.SampleMethod();

            // Displays "SampleMethod inside NestedNamespace."
            NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass();
            inner.SampleMethod();
        }
    }
}

Nomi completi

Gli spazi dei nomi e i tipi hanno nomi univoci, specificati da nomi completi che indicano una gerarchia logica. Ad esempio, l'istruzione A.B implica che A è il nome dello spazio dei nomi o tipo e che B è annidato al suo interno.

Nell'esempio riportato di seguito sono inclusi classi e spazi dei nomi annidati. Il nome completo è indicato come un commento a lato di ogni entità.

namespace N1     // N1
{
    class C1      // N1.C1
    {
        class C2   // N1.C1.C2
        {
        }
    }
    namespace N2  // N1.N2
    {
        class C2   // N1.N2.C2
        {
        }
    }
}

Nel segmento di codice precedente:

  • Lo spazio dei nomi N1 è un membro dello spazio dei nomi globale. Il relativo nome completo è N1.

  • Lo spazio dei nomi N2 è un membro di N1. Il relativo nome completo è N1.N2.

  • La classe C1 è un membro di N1. Il relativo nome completo è N1.C1.

  • Il nome della classe C2 è utilizzato due volte in questo codice. Tuttavia, i nomi completi sono univoci. La prima istanza di C2 è dichiarata in C1; pertanto, il nome completo è N1.C1.C2. La seconda istanza di C2 è dichiarata in uno spazio dei nomi N2; pertanto, il nome completo è N1.N2.C2.

Utilizzando il segmento di codice precedente è possibile aggiungere un nuovo membro della classe, C3, allo spazio dei nomi N1.N2, come indicato di seguito:

namespace N1.N2
{
    class C3   // N1.N2.C3
    {
    }
}

In generale, utilizzare :: per fare riferimento a un alias di uno spazio dei nomi oppure global:: per fare riferimento allo spazio dei nomi globale e . per qualificare i tipi o i membri.

È errato utilizzare :: con un alias che fa riferimento a un tipo anziché a uno spazio dei nomi. Di seguito è riportato un esempio.

using Alias = System.Console;
class TestClass
{
    static void Main()
    {
        // Error
        //Alias::WriteLine("Hi");

        // OK
        Alias.WriteLine("Hi");
    }
}

Tenere presente che la parola global non è un alias predefinito. Di conseguenza, global.X non ha un significato particolare, ma ne acquisisce uno solo se utilizzato con ::.

L'avviso del compilatore CS0440 viene generato se si definisce un alias denominato global, in quanto global:: fa sempre riferimento allo spazio dei nomi globale e non a un alias. Il messaggio di avviso viene ad esempio generato dalla seguente riga:

using global = System.Collections;   // Warning

Con gli alias è consigliabile utilizzare ::, che fornisce la protezione anche dall'introduzione imprevista di tipi aggiuntivi. Esaminare l'esempio riportato di seguito:

using Alias = System;
namespace Library
{
    public class C : Alias.Exception { }
}

La procedura è valida, ma se in seguito viene aggiunto un tipo denominato Alias, Alias. verrà associato a tale tipo. L'utilizzo Alias::Exception assicura che Alias venga considerato come un alias di uno spazio dei nomi e non erroneamente come un tipo.

Per ulteriori informazioni sull'alias global, vedere Procedura: utilizzare l'alias dello spazio dei nomi globale (Guida per programmatori C#).

Vedere anche

Riferimenti

Spazi dei nomi (Guida per programmatori C#)

Parole chiave per spazi dei nomi (Riferimenti per C#)

. Operatore (Riferimenti per C#)

Operatore :: (Riferimenti per C#)

extern (Riferimenti per C#)

Concetti

Guida per programmatori C#