private protected (C#-Referenz)

Die Schlüsselwortkombination private protected ist ein Zugriffsmodifizierer für Member. Ein Member vom Typ „private protected“ kann von der von Typen aus zugegriffen werden, die von der enthaltenden Klasse abgeleitet werden, jedoch nur innerhalb der enthaltenden Assembly. Einen Vergleich von private protected mit den anderen Zugriffsmodifizierern finden Sie unter Zugriffsebenen.

Hinweis

Der Zugriffsmodifizierer private protected ist in C# 7.2 und höher gültig.

Beispiel

Ein Member vom Typ „private protected“ einer Basisklasse kann nur dann von abgeleiteten Typen innerhalb seiner enthaltenden Assembly aus zugegriffen werden, wenn der statische Typ der Variable der abgeleitete Klassentyp ist. Sehen Sie sich z.B. folgenden Codeabschnitt an:

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, BaseClass, und einen davon abgeleiteten Typ, DerivedClass1. BaseClass besitzt einen Member vom Typ „private protected“, myValue, auf den DerivedClass1 auf zwei Arten zuzugreifen versucht. Der erste Versuch, über eine Instanz von BaseClass auf myValue zuzugreifen, führt zu einem Fehler. Der Versuch, es als geerbten Member in DerivedClass1 zu verwenden, gelingt jedoch.

In der zweiten Datei wird ein Versuch, auf myValue als geerbtes Mitglied von DerivedClass2 zuzugreifen, einen Fehler erzeugen, da nur von abgeleiteten Typen in Assembly1 darauf zugegriffen werden kann.

Wenn Assembly1.cs ein InternalsVisibleToAttribute namens Assembly2 enthält, hat die abgeleitete Klasse DerivedClass2 Zugriff auf private protected-Member, die in BaseClass deklariert sind. InternalsVisibleTo macht private protected-Member für abgeleitete Klassen in anderen Assemblys sichtbar.

Strukturmember können nicht vom Typ private protected sein, da die Struktur nicht vererbt werden kann.

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