Geschachtelte Typen (C#-Programmierhandbuch)

Ein innerhalb einer Klasse, Struktur oder Schnittstelle definierter Typ wird als geschachtelter Typ bezeichnet. Beispiel:

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

Unabhängig davon, ob es sich beim äußeren Typ um eine Klasse, Schnittstelle oder Struktur handelt, sind geschachtelte Typen standardmäßig privat, d. h. sie sind nur über den enthaltenden Typ zugänglich. Im vorherigen Beispiel konnten externe Typen nicht auf die Nested-Klasse zugreifen.

Sie können auch einen Zugriffsmodifizierer angeben, um den Zugriff auf einen geschachtelten Typ wie folgt zu definieren:

  • Geschachtelte Typen von class können public, protected, internal, protected internal, private oder private protected sein.

    Durch das Definieren einer geschachtelten protected-, protected internal- oder private protected-Klasse innerhalb einer versiegelten Klasse wird jedoch die Compilerwarnung CS0628, „Neuer geschützter Member in versiegelter Klasse deklariert“, generiert.

    Beachten Sie auch, dass das externe Sichtbarmachen eines geschachtelten Typs gegen die Codequalitätsregel CA1034 „Geschachtelte Typen sollten nicht sichtbar sein“ verstößt.

  • Geschachtelte Typen einer Struktur können öffentlich (public), intern (internal) oder privat (private) sein.

Im folgenden Beispiel wird die Nested-Klasse öffentlich gemacht:

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

Der geschachtelte oder innere Typ kann auf den enthaltenden oder äußeren Typ zugreifen. Um auf den enthaltenden Typ zuzugreifen, übergeben Sie ihn als Argument dem Konstruktor des geschachtelten Typs. Zum Beispiel:

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

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

Ein geschachtelter Typ hat Zugriff auf alle Member, die für ihren äußeren (enthaltenden) Typ zugreifbar sind. Er kann auf die Member des äußeren (enthaltenden) Typs zugreifen, die "private" oder "protected" sind, ebenso auf alle geerbten Member, die "private" oder "protected" sind.

In der vorherigen Deklaration ist Nested der vollständige Name der Klasse Container.Nested. Mit diesem Namen wird wie folgt eine neue Instanz der geschachtelten Klasse erstellt:

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

Weitere Informationen