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
oderstruct
deklariert ist, kann auf dieses Member zugreifen. - protected: Nur Code in derselben
class
oder in einer abgeleitetenclass
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#.