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.
Tutti i tipi e i membri di tipo hanno un livello di accessibilità. Il livello di accessibilità determina se altro codice nel tuo assembly o in altri assembly può utilizzarli. Un assembly è una .dll o un file .exe creato compilando uno o più file .cs in una singola compilazione. Usare i modificatori di accesso seguenti per specificare l'accessibilità di un tipo o di un membro quando viene dichiarato:
- pubblico: il codice in qualsiasi assembly può accedere a questo tipo o membro. Il livello di accessibilità del tipo contenitore controlla il livello di accessibilità dei membri pubblici del tipo.
-
privato: solo il codice dichiarato nello stesso
classostructpuò accedere a questo membro. -
protetto: solo il codice nello stesso
classo in unclassderivato può accedere a questo tipo o membro. - interno: solo il codice nello stesso assembly può accedere a questo tipo o membro.
- interno protetto: solo il codice nello stesso assembly o in una classe derivata in un altro assembly può accedere a questo tipo o membro.
- protetto privato: solo il codice nello stesso assembly e nella stessa classe o una classe derivata può accedere al tipo o al membro.
Usare il modificatore file per i tipi a livello superiore (non annidati). Il file modificatore limita l'accesso al codice nello stesso file di origine. Non è possibile combinare il file modificatore con qualsiasi modificatore di accesso.
Il modificatore record in un tipo fa sì che il compilatore sintetizzi i membri aggiuntivi. Il modificatore record non influisce sull'accessibilità predefinita per un record class o un record struct.
Tabella di riepilogo
| Posizione del chiamante | public |
protected internal |
protected |
internal |
private protected |
private |
|---|---|---|---|---|---|---|
| All'interno della classe | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Classe derivata (stesso assembly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| Classe non derivata (stesso assembly) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ |
| Classe derivata (assembly diverso) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ |
| Classe non derivata (assembly diverso) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
L'esempio seguente illustra come specificare i modificatori di accesso in un tipo e in un membro:
public class Bicycle
{
public void Pedal() { }
}
Non tutti i modificatori di accesso sono validi per tutti i tipi o i membri in tutti i contesti. In alcuni casi, l'accessibilità del tipo contenitore vincola l'accessibilità dei relativi membri.
Più dichiarazioni di una classe parziale o di un membro parziale devono avere la stessa accessibilità. Se una dichiarazione non include un modificatore di accesso, le altre dichiarazioni non possono dichiarare un modificatore di accesso. Il compilatore genera un errore se più dichiarazioni per la classe o il metodo parziale dichiarano accessibilità diverse.
Accessibilità di classi e struct
Le classi e le strutture dichiarate direttamente all'interno di uno spazio dei nomi (non sono annidate all'interno di altre classi o strutture) possono avere accesso public o internal. Se non si specifica un modificatore di accesso, il valore predefinito è internal. È anche possibile usare il file modificatore per limitare l'accesso al file di origine corrente.
È possibile dichiarare membri di struct, incluse classi e struct annidati, come public, internal, o private. È possibile dichiarare membri della classe, incluse classi e struct annidati, come public, protected internal, protected, internal, private protected o private. Per impostazione predefinita, i membri di classi e struct, incluse le classi e le struct annidate, hanno accesso private.
Le classi derivate non possono avere un'accessibilità maggiore di quella dei tipi di base. Non è possibile dichiarare una classe pubblica B che deriva da una classe interna A. Se consentita, avrebbe l'effetto di rendere pubblico A, perché tutti i membri protected o internal di A sono accessibili dalla classe derivata.
È possibile abilitare altri assembly specifici per accedere ai tipi internal usando InternalsVisibleToAttribute. Per altre informazioni, vedere Friend Assemblies (Assembly friend).
Altri tipi
Puoi dichiarare le interfacce direttamente all'interno di un namespace come public o internal. Proprio come le classi e gli struct, per impostazione predefinita le interfacce hanno internal accesso. I membri di interfaccia sono sempre public per impostazione predefinita poiché lo scopo di un'interfaccia è abilitare altri tipi ad accedere a una classe o struct. Le dichiarazioni dei membri dell'interfaccia possono includere qualsiasi modificatore di accesso. Usare i modificatori di accesso ai interface membri per fornire un'implementazione comune necessaria a tutti gli implementatori di interfaccia.
Un tipo delegate dichiarato direttamente in uno spazio dei nomi ha accesso internal per impostazione predefinita.
Per altre informazioni sui modificatori di accesso, vedere la pagina livelli di accessibilità.
Accessibilità del membro
È possibile dichiarare i membri di un class o struct (incluse le classi e le strutture annidate) con uno dei sei tipi di accesso. Non è possibile dichiarare membri struct come protected, protected internalo private protected perché gli struct non supportano l'ereditarietà.
In genere l'accessibilità di un membro non è maggiore dell'accessibilità del tipo contenitore. Tuttavia, è possibile accedere a un public membro di una internal classe dall'esterno dell'assembly se il membro implementa metodi di interfaccia o esegue l'override di metodi virtuali definiti in una classe base pubblica.
Il tipo di qualsiasi membro che è un campo, proprietà o evento deve essere accessibile almeno quanto il membro stesso. Analogamente, il tipo restituito e i tipi di parametri di qualsiasi metodo, indicizzatore o delegato, devono essere accessibili almeno quanto il membro stesso. Ad esempio, non è possibile avere un metodo publicM che restituisce una classe C a meno che C non sia public. Analogamente, non è possibile avere una proprietà protected di tipo A se A viene dichiarata come private.
È necessario dichiarare sempre gli operatori definiti dall'utente come public. Per altre informazioni, vedere Overload degli operatori.
Per impostare il livello di accesso per un membro class o struct, aggiungere la parola chiave appropriata alla dichiarazione del membro, come illustrato nell'esempio seguente.
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int _wheels = 3;
// protected internal property:
protected internal int Wheels => _wheels;
}
I finalizzatori non possono avere modificatori di accessibilità. I membri di un enum tipo sono sempre publice non è possibile applicare modificatori di accesso.
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#.