Freigeben über


geschützte interne (C#-Referenz)

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

Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.

In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.

Tipp

Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.

Jeder Typ innerhalb der enthaltenden Assembly kann auf ein geschütztes internes Element einer Basisklasse zugreifen. Eine abgeleitete Klasse, die sich in einer anderen Assembly befindet, kann nur dann auf das Element zugreifen, 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. BaseClassbesitzt ein geschütztes internes Element, auf das der TestAccess Typ zugreift, myValueda sie sich in derselben Assembly befinden. In der zweiten Datei erzeugt ein Versuch, über eine Instanz eines BaseClass Fehlers zuzugreifenmyValue, während ein Zugriff auf dieses Element über eine Instanz einer abgeleiteten Klasse DerivedClass erfolgreich ist. Diese Zugriffsregel zeigt, dass protected internal der Zugriff von einer beliebigen Klasse innerhalb derselben Assembly oder abgeleiteter Klassen in jeder Assembly möglich ist, sodass sie für die geschützten Zugriffsmodifizierer am meisten zulässig ist.

Strukturmmber können nicht sein protected internal , weil die Struktur nicht geerbt werden kann.

Außerkraftsetzung geschützter interner Member

Wenn Sie ein virtuelles Element außer Kraft setzen, hängt der Modifizierer für die Barrierefreiheit der überschriebenen Methode von der Assembly ab, in der Sie die abgeleitete Klasse definieren.

Wenn Sie die abgeleitete Klasse in derselben Assembly wie die Basisklasse definieren, haben protected internal alle überschriebenen Member Zugriff. Wenn Sie die abgeleitete Klasse in einer anderen Assembly als die Basisklasse definieren, haben protected überschriebene Member 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