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.
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
Definire un metodo come public significa che il metodo Γ¨ disponibile a tutti, in particolare al client che utilizza la libreria
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.
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 {} } }
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