Questo articolo Γ¨ una parziale traduzione di quanto riportato nel libro Thinking in C# di Larry OβBrien e Bruce Eckel con lβaggiunta di immagini reperite sullβinternet.
1. Introduzione
La regola fondamentale che deve essere sempre tenuta a mente nella programmazione ad oggetti Γ¨ separare le cose che cambiano dalle cose che rimangono sempre le stesse. Inoltre un codice ben scritto permette lβuso dallβesterno solo del minor numero possibile di metodi. Per poter garantire entrambe queste condizioni e permettere la scrittura di un buon codice, i linguaggi OO utilizzano i modificatori di accesso, che sono delle parole chiave anteposte ai nomi dei metodi o classi che permettono di indicare i gradi di visibilitΓ del metodo/classe stesso. I livelli di accesso vanno dal meno restrittivo al piΓΉ, e sono i seguenti: public, protected, internal e private
2. Modificatori
2.1 Public
Definire un metodo come public significa che il metodo Γ¨ disponibile a tutti, in particolare al client che utilizza la libreria
2.2 Internal
Un metodo internal viene reso disponibile a tutte le classi che sono allβinterno dello stesso assembly compilato (DLL o exe), ma appare invece come privato allβesterno. Internal permette quindi a classi che sono legate tra di loro logicamente di poter comunicare, conseguente il suo uso ha significato in un codice ben scritto, in cui le responsabilitΓ sono divise per assembly.
2.3 Protected e protected internal
La visibilitΓ di questo metodo Γ¨ per se stessa e per le classi figlie ma non per il mondo esterno. Eβ possibile combinare il protected con il internal, ottenendo cosΓ¬ protected internal, questo significa che lβoggetto puΓ² essere acceduto ai metodi dello stesso assembly e i metodi delle classi figlie.
Protected:
Protected internal
2.4 Private
Un metodo private non puΓ² essere acceduto da nessuno trannte i metodi della classe.
3. Modificatori di default
In C#, lβaccesso a ogni oggetto in cui non Γ¨ stato definito un modificatore diverso Γ¨ βil piΓΉ restrittivo modificatore di accesso che puoi dichiare per quellβelementoβ. Quindi, per esempio, assumiamo di avere la seguente classe:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
questa Γ¨ equivalente a
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
Di seguito riportiamo una tabella esplicativa
Oggetto | Default | AccessibilitΓ permesse |
---|---|---|
namespace | public | Nessuna |
enum | public | Nessuna |
interface | public | Nessuna |
class | private | Tutte |
struct | private | public, internal, private |
delegate | private | Tutte |
constructor | private | Tutte |
interface member | public | Nessuna |
method | private | Tutte |
field | private | Tutte |
user-defined operator | none | public |