Zugriffsmodifizierer (C#-Programmierhandbuch)

Aktualisiert: November 2007

Alle Typen und Typmember verfügen über eine Zugriffsebene, durch die festgelegt wird, ob sie von anderem Code in der Assembly oder anderen Assemblys verwendet werden können. Sie legen den Zugriff für einen Typ oder Member fest, indem Sie ihn mithilfe eines der folgenden Zugriffsmodifizierer deklarieren:

  • public
    Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden.

  • private
    Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur zugegriffen werden.

  • protected
    Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur oder in einer abgeleiteten Klasse zugegriffen werden.

  • internal
    Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly.

  • protected internal
    Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder von jeder abgeleiteten Klasse in einer anderen Assembly zugegriffen werden.

In den folgenden Beispielen wird veranschaulicht, wie Zugriffsmodifizierer für einen Typ und einen Member festgelegt werden:

public class Bicycle
{
    public void Pedal() { }
}

Je nach Typ, Member und Kontext können nicht alle Zugriffsmodifizierer verwendet werden. In verschiedenen Fällen wird der Zugriff für einen Typmember durch die Zugriffmöglichkeiten des enthaltenen Typs eingeschränkt. Die folgenden Abschnitte enthalten weitere Details zu Zugriffsmöglichkeiten.

Verfügbarkeit von Klassen und Strukturen

Klassen und Strukturen, die innerhalb eines Namespace direkt deklariert werden (d. h., sie sind nicht in anderen Klassen oder Strukturen geschachtelt), haben entweder die Zugriffsebene public oder internal. Wenn kein Zugriffsmodifizierer angegeben ist, wird standardmäßig internal verwendet. Geschachtelte Klassen und Strukturen können auch als private deklariert werden. Auf geschachtelte Typen mit der Zugriffsebene private kann nicht vom enthaltenden Typ zugegriffen werden.

Abgeleitete Klassen können keine höhere Zugriffsebene haben als ihre Basistypen. Sie können also keine öffentliche Klasse B von einer internen Klasse A ableiten. Wenn dies zulässig wäre, würde die Zugriffsebene von A auf public festgelegt, da auf alle geschützten oder internen Member von A von der abgeleiteten Klasse aus zugegriffen werden kann.

Sie können bestimmte andere Assemblys aktivieren, um mithilfe des InternalsVisibleTo-Attributs auf die internen Typen zuzugreifen. Weitere Informationen finden Sie unter Friend-Assemblys (C#-Programmierhandbuch).

Verfügbarkeit von Klassen- und Strukturmembern

Klassenmember (einschließlich geschachtelter Klassen und Strukturen) können mit jedem der fünf Zugriffstypen deklariert werden. Strukturmember können nicht als protected deklariert werden, da Strukturen keine Vererbung unterstützen.

Die Zugriffsebene eines Members kann nie höher als die Zugriffsebene seines enthaltenden Typs sein. Eine öffentliche Methode, die in einem internen Typ deklariert wurde, hat beispielsweise nur die Zugriffsebene internal.

Wenn ein Member einer Klasse oder Struktur eine Eigenschaft, ein Feld, eine Methode, ein Ereignis oder ein Delegat ist und dieser Member entweder ein Typ ist oder über einen Typ als Parameter oder Rückgabewert verfügt, kann die Zugriffsebene des Members nicht höher als die des Typs sein. Eine öffentliche Methode M kann beispielsweise nur dann eine Klasse C zurückgeben, wenn C ebenfalls über die Zugriffsebene public verfügt. Entsprechend können Sie nicht über eine geschützte Eigenschaft des Typs A verfügen, wenn A als private deklariert wurde.

Benutzerdefinierte Operatoren müssen immer als public deklariert werden. Weitere Informationen finden Sie unter operator (C#-Referenz).

Destruktoren können nicht über Zugriffsmodifizierer verfügen.

Um die Zugriffsebene für einen Klassen- oder Strukturmember festzulegen, fügen Sie der Memberdeklaration das entsprechende Schlüsselwort hinzu. Hier einige Beispiele:

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}
Hinweis:

Die Zugriffsart protectedinternal bedeutet protected ODER internal, nicht protected UND internal. In anderen Worten, auf einen Member vom Typ protectedinternal kann über jede Klasse in derselben Assembly sowie über abgeleitete Klassen zugegriffen werden. Wenn Sie den Zugriff auf abgeleitete Klassen in derselben Assembly beschränken möchten, deklarieren Sie die Klasse selbst als internal und ihre Member als protected.

Weitere Typen

Schnittstellen, die direkt in einem Namespace deklariert werden, können als public oder internal deklariert werden. Wie bei Klassen und Strukturen ist der Standardzugriff von Schnittstellen internal. Schnittstellenmember sind stets public, da es die Funktion einer Schnittstelle ist, anderen Typen Zugriff auf eine Klasse oder Struktur zu ermöglichen. Auf Schnittstellenmember können keine Zugriffsmodifizierer angewendet werden.

Enumerationsmember sind immer public, und Zugriffsmodifizierer sind nicht erlaubt.

Delegaten verfügen standardmäßig über internal-Zugriff.

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation.

  • 3.5 Memberzugriff

  • 10.3.5 Zugriffsmodifizierer

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Schnittstellen (C#-Programmierhandbuch)

private (C#-Referenz)

public (C#-Referenz)

internal (C#-Referenz)

protected (C#-Referenz)

class (C#-Referenz)

struct (C#-Referenz)

interface (C#-Referenz)