Condividi tramite


Modificatori di accesso (Guida per programmatori C#)

Aggiornamento: novembre 2007

Tutti i tipi e i membri dei tipi prevedono un livello di accessibilità che controlla se possono essere utilizzati da altro codice nell'assembly o in altri assembly. L'accessibilità di un tipo o di un membro viene specificata durante la relativa dichiarazione utilizzando uno dei modificatori di accesso seguenti:

  • public
    Il tipo o il membro è accessibile da altro codice nello stesso assembly o in un altro assembly che vi fa riferimento.

  • private
    Il tipo o il membro è accessibile solo dal codice nella stessa classe o struttura.

  • protected
    Il tipo o il membro è accessibile solo dal codice nella stessa classe o struttura o in una classe derivata.

  • internal
    Il tipo o il membro è accessibile dal codice nello stesso assembly ma non da un altro assembly.

  • protected internal
    Il tipo o il membro è accessibile dal codice nello stesso assembly o da una classe derivata in un altro assembly.

Negli esempi seguenti viene illustrato come specificare i modificatori di accesso su un tipo e su un membro:

public class Bicycle
{
    public void Pedal() { }
}

Non tutti i modificatori di accesso possono essere utilizzati da tutti i tipi o membri in tutti i contesti e in alcuni casi l'accessibilità di un membro di un tipo è vincolata da quella del tipo che lo contiene. Nelle sezioni seguenti sono fornite ulteriori informazioni sull'accessibilità.

Accessibilità a classi e strutture

Le classi e le strutture dichiarate direttamente all'interno di uno spazio dei nomi (ovvero che non sono nidificate all'interno di altre classi o strutture) possono essere pubbliche o interne. Per impostazione predefinita, se non viene specificato alcun modificatore di accesso, sono interne. Le classi e le strutture nidificate possono anche essere dichiarate come private. I tipi nidificati privati non sono accessibili dal tipo che li contiene.

Le classi derivate non possono avere un'accessibilità maggiore di quella dei relativi tipi di base. In altri termini, non è possibile disporre di una classe pubblica B che deriva da una classe interna A. Se questo scenario fosse consentito, la classe A diventerebbe pubblica, perché tutti i membri protetti o interni di A sono accessibili dalla classe derivata.

È possibile consentire ad altri assembly specifici di accedere ai tipi interni utilizzando InternalsVisibleToAttribute. Per ulteriori informazioni, vedere Assembly friend (Guida per programmatori C#).

Accessibilità a membri di classi e strutture

I membri delle classi (incluse classi e strutture nidificate) possono essere dichiarati con uno dei cinque tipi di accesso disponibili. I membri delle strutture non possono essere dichiarati come protetti perché le strutture non supportano l'ereditarietà.

L'accessibilità di un membro non può mai essere maggiore di quella del tipo che lo contiene. Ad esempio, un metodo pubblico dichiarato in un tipo interno dispone solo di accessibilità interna.

Quando un membro di una classe o struttura è una proprietà, un campo, un metodo, un evento o un delegato e corrisponde a un tipo o include un tipo come parametro o come valore restituito, l'accessibilità di tale membro non può essere maggiore di quella del tipo. Ad esempio, non è possibile disporre di un metodo M pubblico che restituisce una classe C, a meno che non sia pubblica anche C. Analogamente, non è possibile disporre di una proprietà protetta di tipo A se A è dichiarato come privato.

Gli operatori definiti dall'utente devono essere sempre dichiarati come pubblici. Per ulteriori informazioni, vedere operator (Riferimenti per C#).

I distruttori non possono includere modificatori di accesso.

Per impostare il livello di accesso per il membro di una classe o di una struttura, aggiungere la parola chiave appropriata alla dichiarazione del membro. Di seguito sono riportati alcuni esempi:

// 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; }
    }
}
Nota:

L'accesso protectedinternal significa protetto O interno, non protetto E interno. In altre parole, un membro protectedinternal è accessibile da qualsiasi classe all'interno dello stesso assembly, incluso le classi derivate. Per limitare l'accesso solo alle classi derivate presenti nello stesso assembly, dichiarare la classe stessa interna e dichiarare i relativi membri come protetti.

Altri tipi

Le interfacce dichiarate direttamente con uno spazio dei nomi possono essere dichiarate come pubbliche o interne e, analogamente alle classi e alle strutture, per impostazione predefinita prevedono l'accesso interno. I membri delle interfacce sono sempre pubblici, perché lo scopo di un'interfaccia è di consentire ad altri tipi l'accesso a una classe o a una struttura. Non è possibile applicare modificatori di accesso ai membri delle interfacce.

I membri delle enumerazioni sono sempre pubblici e non è possibile applicare modificatori di accesso.

I delegati prevedono l'accesso interno per impostazione predefinita.

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le seguenti sezioni incluse in Specifiche del linguaggio C#:

  • 3.5 Accesso ai membri

  • 10.3.5 Modificatori di accesso

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Classi e strutture (Guida per programmatori C#)

Interfacce (Guida per programmatori C#)

private (Riferimenti per C#)

public (Riferimenti per C#)

internal (Riferimenti per C#)

protected (Riferimenti per C#)

class (Riferimenti per C#)

struct (Riferimenti per C#)

interface (Riferimenti per C#)