private protected (informazioni di riferimento su C#)

La combinazione delle parole chiave private protected è un modificatore di accesso ai membri. Un membro protetto privato è accessibile per i tipi derivati dalla classe che lo contiene, ma solo all'interno dell'assembly che lo contiene. Per un confronto di private protected con altri modificatori di accesso, vedere Livelli di accessibilità.

Nota

Il modificatore di accesso private protected è valido in C# versione 7.2 e versioni successive.

Esempio

Un membro protetto privato di una classe base è accessibile dai tipi derivati nell'assembly che lo contiene solo se il tipo statico della variabile è il tipo della classe derivata. Si consideri il segmento di codice di esempio seguente:

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

Questo esempio contiene due file, Assembly1.cs e Assembly2.cs. Il primo file contiene una classe base pubblica, BaseClass, e un tipo derivato, DerivedClass1. BaseClass è proprietaria di un membro protetto privato, myValue, a cui DerivedClass1 prova ad accedere in due modi. Il primo tentativo di accedere a myValue tramite un'istanza di BaseClass genererà un errore. Il tentativo di usarlo come membro ereditato in DerivedClass1 avrà, tuttavia, esito positivo.

Nel secondo file un tentativo di accedere a myValue come membro ereditato di DerivedClass2 genererà un errore, perché è accessibile solo per i tipi derivati in Assembly1.

Se Assembly1.cs contiene un oggetto InternalsVisibleToAttribute che denomina Assembly2, la classe derivata DerivedClass2 avrà accesso ai private protected membri dichiarati in BaseClass. InternalsVisibleTo rende private protected membri visibili alle classi derivate in altri assembly.

I membri struct non possono essere private protected perché struct non può essere ereditato.

Specifiche del linguaggio C#

Per altre informazioni, vedere la specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Vedi anche