Freigeben über


protected internal (C#-Referenz)

Die Schlüsselwortkombination protected internal ist ein Zugriffsmodifizierer für Member. Auf ein geschütztes internes Element kann von der aktuellen Assembly oder von Typen zugegriffen werden, die von der enthaltenden Klasse abgeleitet werden. Einen Vergleich mit protected internal den anderen Zugriffsmodifizierern finden Sie unter Barrierefreiheitsstufen.

Beispiel

Ein Member vom Typ „protected internal“ einer Basisklasse kann von jedem Typ innerhalb seiner enthaltenden Assembly aus zugegriffen werden. Sie ist auch in einer abgeleiteten Klasse, die sich in einer anderen Assembly befindet, nur verfügbar, wenn der Zugriff über eine Variable des abgeleiteten Klassentyps erfolgt. Betrachten Sie beispielsweise das folgende Codesegment:

// 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, BaseClassund eine andere Klasse, TestAccess. BaseClass besitzt ein geschütztes internes Mitglied, myValue, auf das der Typ TestAccess zugreift, da sie sich in derselben Assembly befinden. In der zweiten Datei erzeugt ein Versuch, über eine Instanz eines Elements BaseClass zuzugreifenmyValue, einen Fehler, während ein Zugriff auf dieses Element über eine Instanz einer abgeleiteten Klasse DerivedClass erfolgreich ist. Dies zeigt, dass protected internal der Zugriff von einer beliebigen Klasse innerhalb derselben Assembly oder abgeleiteter Klassen in jeder Assembly ermöglicht wird, sodass sie für die geschützten Zugriffsmodifizierer am meisten zulässig ist.

Strukturelemente können nicht protected internal sein, da die Struktur nicht geerbt werden kann.

Außerkraftsetzung geschützter interner Member

Beim Überschreiben eines virtuellen Elements hängt der Zugriffsmodifizierer 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 endgültige Quelle für C#-Syntax und -Verwendung.

Siehe auch