Modificatori di accesso (Guida per programmatori C#)
Tutti i tipi e i membri di tipo hanno un livello di accessibilità. Il livello di accessibilità controlla se possono essere usati da altro codice nell'assembly o in assembly di terze parti. 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
class
ostruct
può accedere a questo membro. - protetto: solo il codice nello stesso
class
o in unclass
derivato 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.
- file: solo il codice nello stesso file può accedere al tipo o al membro.
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 |
file |
---|---|---|---|---|---|---|---|
All'interno del file | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
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 della classe o del membro parziale 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 gli struct dichiarati direttamente all'interno di uno spazio dei nomi (non sono annidati all'interno di altre classi o struct) possono avere l’accesso public
, internal
o file
. internal
è l'opzione predefinita se non viene specificato nessun modificatore di accesso.
I membri struct, incluse le classi e gli struct annidati, possono essere dichiarati come public
, internal
o private
. I membri della classe, inclusi le classi e gli struct annidati, possono essere public
, protected internal
, protected
, internal
, private protected
o private
. I membri di classi e struct, inclusi le classi e gli struct annidati, hanno accesso private
per impostazione predefinita.
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
Le interfacce dichiarate direttamente all'interno di uno spazio dei nomi possono essere public
o internal
e, proprio come le classi e gli struct, per impostazione predefinita hanno l'accesso internal
. 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. I modificatori di accesso vengono usati nei membri interface
per fornire un'implementazione comune necessaria a tutti gli implementatori di un'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
I membri di un class
o di un struct
(inclusi le classi e gli struct annidati) possono essere dichiarati con uno qualsiasi dei sei tipi di accesso. I membri struct non possono essere dichiarati protected
, protected internal
o private protected
perché struct non supporta l'ereditarietà.
In genere l'accessibilità di un membro non è maggiore dell'accessibilità del tipo contenitore. Un membro public
di una classe internal
potrebbe tuttavia essere accessibile dall'esterno dell'assembly se il membro implementa metodi di interfaccia o esegue l'override di metodi virtuali definiti in una classe di base public.
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 public
M
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
.
Gli operatori definiti dall'utente devono sempre essere dichiarati come public
e static
. 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
{
get { return _wheels; }
}
}
I finalizzatori non possono avere modificatori di accessibilità. I membri di un tipo enum
sono sempre public
e non può essere applicato nessun modificatore di accesso.
Il modificatore di accesso file
è consentito solo nelle dichiarazioni di tipo di livello superiore (non annidato).
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#.