Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die private protected Schlüsselwortkombination ist ein Mitgliedzugriffsmodifizierer. Auf ein privates geschütztes Element kann durch Typen zugegriffen werden, die von der enthaltenden Klasse abgeleitet sind, jedoch nur innerhalb der zugehörigen Assembly. Einen Vergleich mit private protected den anderen Zugriffsmodifizierern finden Sie unter Barrierefreiheitsstufen.
Hinweis
Der private protected Zugriffsmodifizierer ist in C# Version 7.2 und höher gültig.
Beispiel
Auf ein privates geschütztes Mitglied einer Basisklasse kann nur von abgeleiteten Typen in der zugehörigen Assembly zugegriffen werden, wenn der statische Typ der Variablen der abgeleitete Klassentyp ist. Betrachten Sie beispielsweise das folgende Codesegment:
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
private protected int myValue = 0;
}
public class DerivedClass1 : BaseClass
{
void Access()
{
var baseObject = new BaseClass();
// Error CS1540, because myValue can only be accessed by
// classes derived from BaseClass.
// baseObject.myValue = 5;
// OK, accessed through the current derived class instance
myValue = 5;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
void Access()
{
// Error CS0122, because myValue can only be
// accessed by types in Assembly1
// myValue = 10;
}
}
Dieses Beispiel enthält zwei Dateien Assembly1.cs und Assembly2.cs.
Die erste Datei enthält eine öffentliche Basisklasse und BaseClasseinen daraus abgeleiteten Typ. DerivedClass1
BaseClass besitzt ein privates geschütztes Mitglied, myValue, auf das DerivedClass1 innerhalb derselben Assembly als geerbtes Mitglied zugreifen kann.
In der zweiten Datei wird der Versuch, auf myValue als geerbtes Element von DerivedClass2 zuzugreifen, einen Fehler erzeugen, da private protected-Mitglieder nur von abgeleiteten Typen innerhalb derselben Assembly zugänglich sind. Dies ist der hauptunterschied zu protected (der den Zugriff von abgeleiteten Klassen in jeder Assembly zulässt) und protected internal (die den Zugriff von einer beliebigen Klasse innerhalb derselben Assembly oder abgeleiteter Klassen in jeder Assembly ermöglicht).
Wenn Assembly1.cs ein InternalsVisibleToAttribute enthält, das Assembly2 benennt, hat die abgeleitete Klasse DerivedClass2 Zugriff auf die in private protected deklarierten Mitglieder BaseClass.
InternalsVisibleTo macht private protected Mitglieder für abgeleitete Klassen in anderen Assemblies sichtbar.
Vergleich mit anderen geschützten Zugriffsmodifizierern
In der folgenden Tabelle sind die wichtigsten Unterschiede zwischen den drei geschützten Zugriffsmodifizierern zusammengefasst:
| Zugriffsmodifizierer | Dieselbe Assembly, abgeleitete Klasse | Gleiche Assembly, nicht abgeleitete Klasse | Andere Assembly, abgeleitete Klasse |
|---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- Verwenden Sie
protected, wenn Sie möchten, dass abgeleitete Klassen in einer beliebigen Assembly auf das Mitglied zugreifen. - Verwenden Sie
protected internal, wenn Sie den am meisten freizügigen Zugriff wünschen (jede beliebige Klasse in derselben Assembly ODER abgeleitete Klassen egal wo) - Verwenden Sie
private protected, wenn Sie den restriktivsten Schutz-Zugriff benötigen (nur für abgeleitete Klassen in derselben Assembly)
Strukturelemente können nicht private protected sein, da die Struktur nicht vererbt werden kann.
C#-Sprachspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.