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 o struct può accedere a questo membro.
  • protetto: solo il codice nello stesso class o in un class 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.

Quando una dichiarazione di una classe parziale o un metodo parziale non dichiara la sua accessibilità, ha l'accessibilità dell'altra dichiarazione. 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 essere public o internal. 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 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.

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.

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