Condividi tramite


Tipi annidati (Guida per programmatori C#)

Un tipo definito all'interno di una classe, di uno struct o di un’interfaccia è detto tipo nidificato. Ad esempio:

public class Container
{
    class Nested
    {
        Nested() { }
    }
}

Che il tipo esterno sia una classe, un’interfaccia o uno struct, per impostazione predefinita i tipi nidificati sono private e sono accessibili solo dal relativo tipo contenitore. Nell'esempio precedente, la classe Nested non è accessibile a tipi esterni.

È possibile anche specificare un modificatore di accesso per definire l'accessibilità di un tipo annidato, come indicato di seguito:

  • I tipi annidati di una classe possono essere public, protected, internal, protected internal, private o private protected.

    La definizione di una classe annidata protected, protected internal o private protected all'interno di un classe sealed, tuttavia, genera l'avviso del compilatore CS0628: "Il nuovo membro protected è stato dichiarato nella classe sealed".

    Tenere inoltre presente che rendere visibile esternamente un tipo nidificato viola la regola di qualità del codice CA1034 "I tipi nidificati non devono essere visibili".

  • I tipi annidati di uno struct possono essere public, internal o private.

Nell'esempio seguente, la classe Nested viene resa public:

public class Container
{
    public class Nested
    {
        Nested() { }
    }
}

Il tipo annidato, o interno, può accedere al tipo contenitore, o esterno. Per accedere al tipo contenitore, passarlo come argomento al costruttore del tipo annidato. Ad esempio:

public class Container
{
    public class Nested
    {
        private Container? parent;

        public Nested()
        {
        }
        public Nested(Container parent)
        {
            this.parent = parent;
        }
    }
}

Un tipo annidato può accedere a tutti i membri accessibili al tipo contenitore. Può accedere a membri privati e protetti del tipo che li contengono, inclusi tutti i membri protetti ereditati.

Nella dichiarazione precedente il nome completo della classe Nested è Container.Nested. Questo nome viene utilizzato per creare una nuova istanza della classe annidata, come illustrato di seguito:

Container.Nested nest = new Container.Nested();

Vedi anche