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: Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden. Die Zugriffsebene öffentlicher Member eines Typs wird durch die Zugriffsebene des Typs selbst gesteuert.
  • private: Der Zugriff auf den Typ oder Member kann nur über Code innerhalb derselben class- oder struct-Instanz erfolgen.
  • protected: Der Zugriff auf den Typ oder Member kann nur über Code in derselben class- oder in einer class-Instanz erfolgen, die von dieser class-Instanz abgeleitet wurde.
  • internal: Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly. Mit anderen Worten: Im Code kann auf internal-Typen oder -Member kann zugegriffen werden, der Teil derselben Kompilierung ist.
  • protected internal: Der Zugriff auf den Typ oder Member kann über beliebigen Code in der Assembly, in der er deklariert wurde, oder innerhalb einer abgeleiteten class-Instanz in einer anderen Assembly erfolgen.
  • private protected: Auf den Typ oder Member kann von Typen zugegriffen werden, die von class abgeleitet sind und in der enthaltenden Assembly deklariert werden.

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 manchen Fällen wird der Zugriff auf ein Typmember durch den Zugriff des enthaltenden Typs eingeschränkt.

Zugriff auf Klassen, Datensätze und Strukturen

Klassen, Datensätze und Strukturen, die direkt innerhalb eines Namespace deklariert werden (also nicht in anderen Klassen oder Strukturen geschachtelt sind), können die Zugriffsebene public oder internal aufweisen. 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. Auf private geschachtelte Typen kann nicht von außerhalb des enthaltenden Typs zugegriffen werden.

Abgeleitete Klassen und Datensätze können keine höhere Zugänglichkeit 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.

Zugriff auf Klassen-, Datensatz- und Strukturmember

Klassen- und Datensatzmember (einschließlich geschachtelter Klassen, Datensätze 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 internen 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.

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

Fügen Sie der Memberdeklaration wie im folgenden Beispiel gezeigt das entsprechende Schlüsselwort hinzu, um die Zugriffsebene für einen class-, record- 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; }
    }
}

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. Schnittstellenmemberdeklarationen können einen beliebigen Zugriffsmodifizierer aufweisen. Das ist für statische Methoden besonders nützlich, um allgemeine Implementierungen bereitzustellen, die von allen Implementierern einer Klasse benötigt werden.

Enumerationsmember weisen immer die Zugriffsebene public auf, und es können keine Zugriffsmodifizierer angewendet werden.

Delegaten verhalten sich wie Klassen und Strukturen. Sie verfügen standardmäßig über internal-Zugriff, wenn sie in einem Namespace deklariert wurden, sie verfügen über private-Zugriff, wenn sie geschachtelt sind.

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