Dela via


skyddat internt (C#-referens)

Nyckelordskombinationen protected internal är en medlemsåtkomstmodifierare. Du kan komma åt en skyddad intern medlem från den aktuella sammansättningen eller från typer som härleds från den innehållande klassen. En jämförelse av protected internal med de andra åtkomstmodifierarna finns i Hjälpmedelsnivåer.

C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.

Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.

Tips/Råd

Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.

Alla typer i den innehållande sammansättningen kan komma åt en skyddad intern medlem i en basklass. En härledd klass som finns i en annan sammansättning kan endast komma åt medlemmen om åtkomsten sker via en variabel av den härledda klasstypen. Tänk till exempel på följande kodsegment:

// 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;
    }
}

Det här exemplet innehåller två filer Assembly1.cs och Assembly2.cs. Den första filen innehåller en offentlig basklass, BaseClass, och en annan klass, TestAccess. BaseClass äger en skyddad intern medlem, myValue, som TestAccess typen kommer åt eftersom de finns i samma sammansättning. I den andra filen genererar ett försök att komma åt myValue via en instans av BaseClass ett fel, medan en åtkomst till den här medlemmen via en instans av en härledd klass DerivedClass lyckas. Den här åtkomstregeln visar att protected internal tillåter åtkomst från alla klasser inom samma sammansättning eller härledda klasser i alla sammansättningar, vilket gör den till den mest tillåtande av de skyddade åtkomstmodifierarna.

Struct-medlemmar kan inte bero protected internal på att structen inte kan ärvas.

Åsidosätta skyddade interna medlemmar

När du åsidosätter en virtuell medlem beror hjälpmedelsmodifieraren för den åsidosatta metoden på sammansättningen där du definierar den härledda klassen.

När du definierar den härledda klassen i samma sammansättning som basklassen har protected internal alla överordnade medlemmar åtkomst. Om du definierar den härledda klassen i en annan sammansättning än basklassen har protected åsidosatta medlemmar åtkomst.

// 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;
    }
}

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även