Classi in C#

Molti linguaggi di programmazione moderni supportano il paradigma orientato agli oggetti, e C# ne è un esempio notevole.

Comprendere come C# gestisce classi e oggetti risulta quindi fondamentale a prescindere dal linguaggio OOP che si decide di adottare.

In questa lezione vedremo in che modo le classi in C# rappresentano le fondamenta per la costruzione di applicazioni, illustrando un esempio concreto con la classe Gatto.

Classi in C

Finora abbiamo analizzato diverse caratteristiche comuni della OOP. Gran parte dei linguaggi di programmazione moderni sono object-oriented, ognuno con particolarità proprie per quanto riguarda l'utilizzo di classi e oggetti.

Sebbene qui ci concentriamo sul linguaggio C#, è bene comunque sapere che i concetti OOP in C# possono risultare utili in qualunque linguaggio orientato agli oggetti, poiché la OOP è un concetto fondamentale nella programmazione, utilizzato praticamente da tutti i linguaggi moderni.

Cosa Sono le Classi in C#?

Una classe in C# viene definita mediante la keyword class, seguita da un identificatore (il nome della classe) e da un insieme di membri (dati e metodi) racchiusi in un blocco di codice separato.

Le classi in C# possono contenere:

  • Campi: variabili membro di un determinato tipo.
  • Proprietà: elementi speciali che estendono la funzionalità dei campi, consentendo una gestione più accurata dei dati all'atto di leggere e scrivere i valori. Approfondiremo le proprietà nelle prossime lezioni.
  • Metodi: implementano le operazioni e la logica di manipolazione dei dati.

Una Classe di Esempio

Ecco un esempio di una classe in C#, che include i membri elencati.

La classe Gatto modella l'oggetto reale gatto e possiede le proprietà Nome e Colore.

Nella definizione compaiono alcuni campi, proprietà e metodi che vedremo più avanti in modo dettagliato.

Per ora osserviamo la struttura:

public class Gatto
{
    // Campo: Nome
    private string nome;
    // Campo: Colore
    private string coloree;

    public string Nome
    {
        // *Getter* della proprietà "Nome"
        get
        {
            return this.nome;
        }
        // *Setter* della proprietà "Nome"
        set
        {
            this.nome = value;
        }
    }

    public string Colore
    {
        // *Getter* della proprietà "Colore"
        get
        {
            return this.coloree;
        }
        // *Setter* della proprietà "Colore"
        set
        {
            this.coloree = value;
        }
    }

    // Costruttore di Default
    public Gatto()
    {
        this.nome = "SenzaNome";
        this.colore = "grigio";
    }

    // Costruttore con Parametri
    public Gatto(string nome, string colore)
    {
        this.nome = nome;
        this.colore = colore;
    }

    // Metodo Miagola
    public void Miagola()
    {
        Console.WriteLine("Gatto {0} dice: Miao!", nome);
    }
}

La classe Gatto definisce le proprietà Nome e Colore, che archiviano i valori effettivi all'interno dei campi (fields) nome e colore (privati).

Inoltre, vengono dichiarati due costruttori: uno di default senza parametri e uno che riceve in input i valori di nome e colore.

Infine, si trova un metodo Miagola(), che fa eseguire al gatto l'azione di miagolare.

Dopo aver definito la classe di esempio, possiamo usarla nel seguente modo:

static void Main()
{
    Gatto primoGatto = new Gatto();
    primoGatto.Nome = "Zefiro";
    primoGatto.Miagola();

    Gatto secondoGatto = new Gatto("Mochi", "rosso");
    secondoGatto.Miagola();
    Console.WriteLine("Gatto {0} è {1}.",
                      secondoGatto.Nome, secondoGatto.Colore);
}

Se eseguiamo questo codice, otterremo l'output:

Gatto Zefiro dice: Miao!
Gatto Mochi dice: Miao!
Gatto Mochi è rosso.

Questo è un semplice esempio per definire e usare classi.

Nella prossima lezione, esamineremo con maggiori dettagli come creare oggetti, accedere alle loro proprietà e invocarne i metodi, e capiremo meglio come funziona tale esempio.

Classi di Sistema

La chiamata al metodo Console.WriteLine(...) della classe System.Console è un esempio di uso di una classe di sistema in C#.

Vengono chiamate system classes le classi definite nelle librerie standard, utilizzabili con C# (o con altri linguaggi di programmazione). Esse sono parte della piattaforma .NET, che include un insieme di linguaggi (C#, VB.NET, ecc.), compilatori e una standard class library contenente migliaia di classi di sistema per le operazioni più comuni: input/output da console, elaborazione di testi, collezioni di dati, parallel execution, networking, accesso a database, elaborazione di dati, creazione di applicazioni Web, GUI e mobili.

È importante notare che l'implementazione della logica in tali classi è incapsulata (nascosta) al loro interno. Per il programmatore è importante sapere che queste classi funzionano, ma non necessariamente come sono implementate. Questo approccio, chiamato astrazione, evita di esporre dettagli superflui e rappresenta uno dei principi fondamentali della OOP.

Approfondiremo le classi di sistema più avanti. Ora è il momento di familiarizzare con la creazione e l'uso di oggetti nei programmi. Questo sarà l'argomento della prossima lezione.

In Sintesi

In questa lezione abbiamo visto i seguenti concetti chiave:

  • Classi in C#: vengono definite con class NomeClasse { ... } e possono includere campi, proprietà e metodi.
  • Esempio Gatto: mostra come un'unica classe può avere più costruttori, oltre a campi privati gestiti attraverso proprietà e metodi pubblici.
  • Creazione di oggetti: avviene istanziando la classe con new. L'uso di costruttori multipli permette diversi modi di inizializzare gli oggetti.
  • Classi di sistema: C# fornisce librerie standard (System.Console, String, Environment, Math, ecc.) che incapsulano funzionalità comuni, semplificando la programmazione.
  • Incapsulamento e astrazione: la logica interna delle classi di sistema non è visibile all'utente, garantendo semplicità e sicurezza del codice.