Freigeben über


Zugriffsmodifizierer (C#-Programmierhandbuch)

Alle Typen und Typmember verfügen über eine Zugriffsebene. Die Barrierefreiheitsebene steuert, ob andere Code in Ihrer Assembly oder anderen Assemblys sie verwenden 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.

Verwenden Sie den Dateimodifizierer für Typen der obersten Ebene (nicht-geschachtelte Typen). Der file Modifizierer beschränkt den Zugriff auf Code in derselben Quelldatei. Sie können den file Modifizierer nicht mit jedem Zugriffsmodifizierer kombinieren.

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
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 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 (nicht innerhalb anderer Klassen oder Strukturen geschachtelt sind), können public- oder internal-Zugriff haben. Wenn Sie keinen Zugriffsmodifizierer angeben, ist internalder Standardwert . Sie können den file Modifizierer auch verwenden, um den Zugriff auf die aktuelle Quelldatei einzuschränken.

Sie können Strukturmitglieder deklarieren, einschließlich geschachtelter Klassen und Strukturen, als public, internal, oder private. Sie können Klassenmitglieder, einschließlich geschachtelter Klassen und Strukturen, als public, protected internal, protected, internal, private protected oder private deklarieren. Standardmäßig haben Klassen- und Strukturmitglieder, einschließlich geschachtelter Klassen und Strukturen, private Zugriff.

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

Sie können Schnittstellen direkt in einem Namespace deklarieren als public oder internal. Ähnlich wie Klassen und Strukturen haben Schnittstellen standardmäßig 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. Verwenden Sie 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

Sie können Member einer class oder struct (einschließlich geschachtelter Klassen und Strukturen) mit einer der sechs Zugriffsarten deklarieren. Sie können struct-Mitglieder nicht als protected, protected internal oder private protected deklarieren, weil Strukturen keine Vererbung unterstützen.

Normalerweise ist der Zugriff auf einen Member nicht höher als der Zugriff des Typs, der ihn enthält. Sie können jedoch von außerhalb der Assembly auf ein public Mitglied einer internal Klasse zugreifen, wenn das Mitglied 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 public-Methode mit der Zugriffsebene M 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.

Sie müssen immer benutzerdefinierte Operatoren als deklarieren.public 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 => _wheels;
}

Finalizer können nicht über Zugriffsmodifizierer verfügen. Elemente eines enum Typs sind immer public, und Sie können keine Zugriffsmodifizierer anwenden.

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