Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La combinazione di private protected parole chiave è un modificatore di accesso ai membri. Un membro protetto privato è accessibile dai tipi derivati dalla classe contenitore, ma solo all'interno dell'assembly che lo contiene. Per un confronto con gli altri modificatori di private protected accesso, vedere Livelli di accessibilità.
Annotazioni
Il private protected modificatore di accesso è valido in C# versione 7.2 e successive.
Esempio
Un membro privato protetto di una classe base è accessibile dai tipi derivati all'interno dell'assembly contenitore solo se il tipo statico della variabile corrisponde al tipo della classe derivata. Si consideri ad esempio il segmento di codice seguente:
// 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;
}
}
Questo esempio contiene due file e Assembly1.csAssembly2.cs.
Il primo file contiene una classe base pubblica, BaseClasse un tipo derivato da esso, DerivedClass1.
BaseClass è proprietario di un membro protetto privato, myValue, che DerivedClass1 può accedere come membro ereditato all'interno dello stesso assembly.
Nel secondo file, un tentativo di accesso myValue come membro ereditato di DerivedClass2 genererà un errore, perché private protected i membri sono accessibili solo dai tipi derivati all'interno dello stesso assembly. Questa è la differenza principale da protected (che consente l'accesso da classi derivate in qualsiasi assembly) e protected internal (che consente l'accesso da qualsiasi classe all'interno dello stesso assembly o classi derivate in qualsiasi assembly).
Se Assembly1.cs contiene un oggetto InternalsVisibleToAttribute che denomina Assembly2, la classe DerivedClass2 derivata avrà accesso ai private protected membri dichiarati in BaseClass.
InternalsVisibleTo rende i membri di private protected visibili alle classi derivate in altri assembly.
Confronto con altri modificatori di accesso protetto
La tabella seguente riepiloga le differenze principali tra i tre modificatori di accesso protetto:
| Modificatore di accesso | Stesso assembly, classe derivata | Stesso assembly, classe non derivata | Assembly diverso, classe derivata |
|---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- Usare
protectedquando si desidera che le classi derivate in qualsiasi assembly accettino il membro - Usare
protected internalquando si vuole ottenere l'accesso più permissivo (qualsiasi classe nello stesso assembly O classi derivate ovunque) - Usare
private protectedquando si desidera l'accesso protetto più restrittivo (solo le classi derivate nello stesso assembly)
I membri dello struct non possono essere private protected perché lo struct non può essere ereditato.
Specificazione 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#.