Share via


skyddat internt (C#-referens)

Nyckelordskombinationen protected internal är en medlemsåtkomstmodifierare. En skyddad intern medlem är tillgänglig 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.

Exempel

En skyddad intern medlem i en basklass är tillgänglig från alla typer inom dess innehållande sammansättning. Den är också tillgänglig i en härledd klass som finns i en annan sammansättning endast 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 används av TestAccess typen . I den andra filen skapar 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.

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 den härledda klassen definieras.

När den härledda klassen definieras i samma sammansättning som basklassen har protected internal alla överordnade medlemmar åtkomst. Om den härledda klassen definieras 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