Freigeben über


private protected (C#-Referenz)

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.

Siehe auch