Zugriffsmodifizierer (C#-Programmierhandbuch)

Alle Typen und Typmember verfügen über eine Zugriffsebene. Diese Zugriffsebene steuert, ob sie von anderem Code in Ihrer Assembly oder anderen Assemblys verwendet werden können. Eine Assembly ist eine DLL- oder EXE-Datei, die durch Kompilieren einer oder mehrerer CS-Dateien in einer einzelnen Kompilierung erstellt wurde. Mithilfe der folgenden Zugriffsmodifizierer können Sie den Zugriff auf einen Typ oder Member festlegen, wenn Sie ihn deklarieren:

  • public: Code in jeder Assembly kann auf diesen Typ oder dieses Member zugreifen. Die Zugriffsstufe des enthaltenen Typs steuert die Zugriffsstufe der öffentlichen Member des Typs.
  • private: Nur Code, der in derselben class oder struct deklariert ist, kann auf dieses Member zugreifen.
  • protected: Nur Code in derselben class oder in einer abgeleiteten class kann auf diesen Typ oder auf dieses Member zugreifen.
  • internal: Nur Code in derselben Assembly kann auf diesen Typ oder auf dieses Member zugreifen.
  • protected internal: Nur Code in derselben Assembly oder in einer abgeleiteten Klasse in einer anderen Assembly kann auf diesen Typ oder dieses Member zugreifen.
  • private protected: Nur Code in derselben Assembly und in derselben Klasse oder einer abgeleiteten Klasse kann auf diesen Typ oder dieses Member zugreifen.
  • Datei: Nur Code in derselben Datei kann auf den Typ oder das Element zugreifen.

Der record-Modifizierer für einen Typ bewirkt, dass der Compiler zusätzliche Member synthetisiert. Der record-Modifizierer wirkt sich nicht auf den Standardzugriff für eine record class oder record struct aus.

Zusammenfassungstabelle

Standort des Aufrufers public protected internal protected internal private protected private file
Innerhalb der Datei ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Innerhalb der Klasse ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Abgeleitete Klasse (selbe Assembly) ✔️ ✔️ ✔️ ✔️ ✔️
Nicht abgeleitete Klasse (selbe Assembly) ✔️ ✔️ ✔️
Abgeleitete Klasse (andere Assembly) ✔️ ✔️ ✔️
Nicht abgeleitete Klasse (andere Assembly) ✔️

Die folgenden Beispiele veranschaulichen, wie Zugriffsmodifizierer für einen Typ und Member angegeben werden:

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

Nicht alle Zugriffsmodifizierer sind für alle Typen oder Member in allen Kontexten gültig. In einigen Fällen wird der Zugriff auf die Member des enthaltenen Typs durch den Zugriff auf den Typ eingeschränkt.

Mehrere Deklarationen einer Teilklasse oder eines Teilmitglieds müssen über die gleiche Barrierefreiheit verfügen. Wenn eine Deklaration der Teilklasse oder des Teilmitglieds keinen Zugriffsmodifizierer enthält, können die anderen Deklarationen keinen Zugriffsmodifizierer deklarieren. Der Compiler erzeugt einen Fehler, wenn mehrere Deklarationen für die partielle Klasse oder Methode unterschiedliche Zugriffsmöglichkeiten deklarieren.

Zugriff auf Klassen und Strukturen

Klassen und Strukturen, die direkt innerhalb eines Namespace deklariert werden (also nicht in anderen Klassen oder Strukturen geschachtelt sind), können über Zugriff vom Typ public, internal oder file verfügen. Wenn kein Zugriffsmodifizierer angegeben ist, wird standardmäßig internal verwendet.

Strukturmember, einschließlich geschachtelter Klassen und Strukturen, können als public, internal oder private deklariert werden. Für Klassenmember, einschließlich geschachtelter Klassen und Strukturen, kann public, protected internal, protected, internal, private protected oder private deklariert werden. Klassen und Strukturmember, einschließlich geschachtelter Klassen und Strukturen, weisen standardmäßig private-Zugriff auf.

Abgeleitete Klassen können keine höhere Verfügbarkeit als ihre Basistypen aufweisen. Sie können keine öffentliche B-Klasse deklarieren, die von einer internen A-Klasse abgeleitet wird. Wenn dies zulässig wäre, würde A als öffentlich festgelegt werden, da der Zugriff auf alle protected- oder internal-Member von A über die abgeleitete Klasse möglich wäre.

Mithilfe von InternalsVisibleToAttribute können Sie den Zugriff auf Ihre internen Typen durch spezifische andere Assemblys ermöglichen. Weitere Informationen finden Sie unter Friend-Assemblys.

Andere Typen

Schnittstellen, die direkt in einem Namespace deklariert wurden, können die Zugriffsebene public oder internal aufweisen. Außerdem verfügen Schnittstellen wie Klassen und Strukturen standardmäßig über internal-Zugriff. Für Schnittstellenmember ist standardmäßig public festgelegt, da es der Zweck einer Schnittstelle ist, anderen Typen den Zugriff auf eine Klasse oder Struktur zu ermöglichen. Memberdeklarationen für Schnittstellen können einen beliebigen Zugriffsmodifizierer aufweisen. Sie verwenden Zugriffsmodifizierer für interface-Member, um eine gemeinsame Implementierung bereitzustellen, die von allen Implementierern einer Schnittstelle benötigt wird.

Ein direkt in einem Namespace deklarierter delegate-Typ hat standardmäßig internal-Zugriff.

Weitere Informationen zu Zugriffsmodifizierern finden Sie auf der Seite Zugriffsebenen.

Memberzugriff

Member einer class oder struct (einschließlich geschachtelter Klassen und Strukturen) können mit einem der sechs Zugriffstypen deklariert werden. Strukturmember können nicht als protected, protected internal oder private protected deklariert werden, da Strukturen die Vererbung nicht unterstützen.

Normalerweise ist der Zugriff auf einen Member nicht höher als der Zugriff des Typs, der ihn enthält. Allerdings kann auf einen public-Member einer internal Klasse möglicherweise von außerhalb der Assembly zugegriffen werden, wenn der Member Schnittstellenmethoden implementiert oder virtuelle Methoden überschreibt, die in einer öffentlichen Basisklasse definiert sind.

Der Typ aller Memberfelder, -eigenschaften oder -ereignisse muss mindestens über den Member selbst zugänglich sein. Ebenso müssen der Rückgabetyp und die Parametertypen von Methoden, Indexer oder Delegaten mindestens so zugänglich wie der Member selbst sein. Sie können beispielsweise keine M-Methode mit der Zugriffsebene public verwenden, die eine C-Klasse zurückgibt, es sei denn, C verfügt ebenfalls über die Zugriffsebene public. Ebenso können Sie keine protected-Eigenschaft vom Typ A verwenden, wenn A als private deklariert ist.

Benutzerdefinierte Operatoren müssen immer als public und static deklariert werden. Weitere Informationen finden Sie unter Operatorüberladung.

Fügen Sie wie im folgenden Beispiel gezeigt das entsprechende Schlüsselwort zur Memberdeklaration hinzu, um die Zugriffsebene für einen class- oder struct-Member festzulegen.

// 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; }
    }
}

Finalizer können nicht über Zugriffsmodifizierer verfügen. Member mit dem Typ enum weisen immer die Zugriffsebene public auf, und es können keine Zugriffsmodifizierer angewendet werden.

Der file-Zugriffsmodifizierer ist nur für Typendeklarationen der obersten Ebene (nicht geschachtelt) zulässig.

C#-Sprachspezifikation

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch