Dela via


privat skyddad (C#-referens)

Nyckelordskombinationen private protected är en medlemsåtkomstmodifierare. En privat skyddad medlem kan nås av typer som härleds från den innehållande klassen, men endast inom dess innehållande sammansättning. En jämförelse av private protected med de andra åtkomstmodifierarna finns i Hjälpmedelsnivåer.

Anmärkning

Åtkomstmodifieraren private protected är giltig i C#-version 7.2 och senare.

Exempel

En privat skyddad medlem i en basklass är endast tillgänglig från härledda typer i dess innehållande sammansättning om variabelns statiska typ är den härledda klasstypen. Tänk till exempel på följande kodsegment:

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

public class DerivedClass1 : BaseClass
{
    void Access()
    {
        var baseObject = new BaseClass();

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

        // OK, accessed through the current derived class instance
        myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
    void Access()
    {
        // Error CS0122, because myValue can only be
        // accessed by types in Assembly1
        // 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 typ som härleds från den, DerivedClass1. BaseClass äger en privat skyddad medlem, myValue, som DerivedClass1 kan komma åt som en ärvd medlem i samma sammansättning.

I den andra filen kommer ett försök att komma åt myValue som en ärvd medlem av DerivedClass2 att orsaka ett fel, eftersom private protected-medlemmar endast är tillgängliga för härledda typer inom samma assembly. Detta är den viktigaste skillnaden från protected (som tillåter åtkomst från härledda klasser i alla sammansättningar) och protected internal (som tillåter åtkomst från vilken klass som helst inom samma sammansättning eller härledda klasser i alla sammansättningar).

Om Assembly1.cs innehåller ett InternalsVisibleToAttribute som namnger Assembly2, kommer den härledda klassen DerivedClass2 att ha åtkomst till private protected medlemmar som deklarerats i BaseClass. InternalsVisibleTo gör private protected medlemmar synliga för härledda klasser i andra sammansättningar.

Jämförelse med andra skyddade åtkomstmodifierare

I följande tabell sammanfattas de viktigaste skillnaderna mellan de tre skyddade åtkomstmodifierarna:

Åtkomstmodifierare Samma sammansättning, härledd klass Samma sammansättning, icke-härledd klass Annan sammansättning, härledd klass
protected ✔️ ✔️
protected internal ✔️ ✔️ ✔️
private protected ✔️
  • Använd protected när du vill att härledda klasser i en sammansättning ska få åtkomst till medlemmen
  • Använd protected internal när du vill ha den mest tillåtande åtkomsten (alla klasser i samma sammansättning eller härledda klasser var som helst)
  • Använd private protected när du vill ha den mest restriktiva skyddade åtkomsten (endast härledda klasser i samma sammansättning)

Struct-medlemmar kan inte vara private protected eftersom strukturen inte kan ärvas.

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