Modificatori di accesso

Comprendere l’utilizzo dei modificatori di accesso delle classi è indispensabile per poter programmare bene ad oggetti. Vediamo come e perchè utilizzarli.

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

OggettoDefaultAccessibilità permesse
namespacepublicNessuna
enumpublicNessuna
interfacepublicNessuna
classprivateTutte
structprivatepublic, internal, private
delegateprivateTutte
constructorprivateTutte
interface memberpublicNessuna
methodprivateTutte
fieldprivateTutte
user-defined operatornonepublic

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.

Indice

Share
Ultimi articoli
Join

Newsletter

Nessuno spam, solo articoli interessanti ;)

Focus

Post correlati

semaphoreslim

SmaphoreSlim 101

SemaphoreSlim è una classe che permette la sincronizzazione di n thread che hanno una risorsa (scarsa) condivisa limitandone l’uso ad un numero massimo.

interlocked

Interlocked 101

La sincronizzazione dei thread è un elemento fondamentale nella programmazione asincrona, ne ho infatti parlato in vari post. La soluzione più versatile è sicuramente utilizzare

event

Come testare gli eventi

Testare che degli eventi siano stato effettivamente lanciati in C# non è immediato. Tipicamente è possibile testare che un evento venga lanciato aspettando un ManualResetEvent

Codice Pragmatico

Contatti

Per informazioni, dubbi o consulenze non esitate a contattarmi.

Lascia un messaggio

Ricevi le ultime news

Iscrivi alla newsletter

Solo articoli interessanti, promesso ;)