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
oprivate 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();