protected internal (C#-Referenz)

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

Beispiel

Ein Member vom Typ „protected internal“ einer Basisklasse kann von jedem Typ innerhalb seiner enthaltenden Assembly aus zugegriffen werden. Sie kann auch von einer abgeleiteten Klasse zugegriffen werden, die sich in einer anderen Assembly befindet, jedoch nur, wenn der Zugriff über eine Variable des abgeleiteten Klassentyps erfolgt. Sehen Sie sich z.B. folgenden Codeabschnitt an:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
   protected internal int myValue = 0;
}

class TestAccess
{
    void Access()
    {
        var baseObject = new BaseClass();
        baseObject.myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 10;

        // OK, because this class derives from BaseClass.
        derivedObject.myValue = 10;
    }
}

Dieses Beispiel enthält zwei Dateien, Assembly1.cs und Assembly2.cs. Die erste Datei enthält eine öffentliche Basisklasse, BaseClass, und eine weitere Klasse, TestAccess. BaseClass besitzt einen Member vom Typ „protected internal“, myValue, auf den über den Typ TestAccess zugegriffen wird. In der zweiten Datei verursacht ein Versuch, über eine BaseClass-Instanz auf myValue zuzugreifen, einen Fehler, während ein Zugriff auf diesen Member über eine Instanz einer abgeleiteten Klasse DerivedClass gelingt.

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

Außerkraftsetzung geschützter interner Member

Beim Überschreiben eines virtuellen Elements hängt der Modifizierer für die Barrierefreiheit der überschriebenen Methode von der Assembly ab, in der die abgeleitete Klasse definiert ist.

Wenn die abgeleitete Klasse in derselben Assembly wie die Basisklasse definiert ist, haben alle überschriebenen Member protected internal-Zugriff. Wenn die abgeleitete Klasse in einer anderen Assembly von der Basisklasse definiert ist, haben überschriebene Member protected-Zugriff.

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    protected internal virtual int GetExampleValue()
    {
        return 5;
    }
}

public class DerivedClassSameAssembly : BaseClass
{
    // Override to return a different example value, accessibility modifiers remain the same.
    protected internal override int GetExampleValue()
    {
        return 9;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
    // Override to return a different example value, since this override
    // method is defined in another assembly, the accessibility modifiers
    // are only protected, instead of protected internal.
    protected override int GetExampleValue()
    {
        return 2;
    }
}

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