Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un tipo definito all'interno di una classe, uno struct o un'interfaccia è detto tipo annidato. Per esempio
public class Container
{
class Nested
{
Nested() { }
}
}
Indipendentemente dal fatto che il tipo esterno sia una classe, un'interfaccia o uno struct, per impostazione predefinita i tipi annidati sono privati; sono accessibili solo dal tipo contenitore. Nell'esempio precedente la classe Nested
non è accessibile ai tipi esterni.
È anche possibile 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 pubblici, protetti, interni, protetti interni, privati o privati.
Tuttavia, la definizione di una
protected
classe annidataprotected internal
oprivate protected
all'interno di una classe sealed genera l'avviso del compilatore CS0628, "nuovo membro protetto dichiarato nella classe sealed".Tenere inoltre presente che rendere visibile esternamente un tipo annidato viola la regola di qualità del codice CA1034 "I tipi annidati non devono essere visibili".
I tipi annidati di uno struct possono essere pubblici, interni o privati.
L'esempio seguente rende pubblica la classe Nested
:
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. Per esempio:
public class Container
{
public class Nested
{
private Container? parent;
public Nested()
{
}
public Nested(Container parent)
{
this.parent = parent;
}
}
}
Un tipo annidato ha accesso a tutti i membri accessibili al tipo che lo contiene. Può accedere a membri privati e protetti del tipo contenitore, inclusi tutti i membri protetti ereditati.
Nella dichiarazione precedente il nome completo della classe Nested
è Container.Nested
. Questo è il nome usato per creare una nuova istanza della classe annidata, come indicato di seguito:
Container.Nested nest = new Container.Nested();