Menu
Coddy logo textTech

IDisposable e istruzione using

Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 45 di 70.

Alcuni oggetti mantengono risorse che il garbage collector non può liberare automaticamente: handle di file, connessioni al database, socket di rete. L'interfaccia IDisposable fornisce un modo standard per rilasciare queste risorse quando hai finito di usarle.

Una classe implementa IDisposable fornendo un metodo Dispose():

public class FileHandler : IDisposable
{
    private bool disposed = false;
    
    public void Dispose()
    {
        if (!disposed)
        {
            Console.WriteLine("Releasing resources...");
            disposed = true;
        }
    }
}

Potresti chiamare Dispose() manualmente, ma cosa succede se si verifica un'eccezione prima di raggiungere quella riga? L'istruzione using garantisce che la pulizia avvenga, anche quando qualcosa va storto:

using (FileHandler handler = new FileHandler())
{
    // Lavora con il gestore
}  // Dispose() viene chiamato automaticamente qui

Il C# moderno offre una sintassi più pulita con la dichiarazione using, che elimina l’oggetto quando esce dall’ambito:

void ProcessFile()
{
    using FileHandler handler = new FileHandler();
    // Lavora con handler
}  // Dispose() viene chiamato quando il metodo termina

L'istruzione using funziona con qualsiasi tipo che implementi IDisposable. Le classi integrate come StreamReader, SqlConnection e HttpClient implementano tutte questa interfaccia, rendendo la gestione corretta delle risorse semplice e affidabile.

challenge icon

Sfida

Facile

Costruiamo un simulatore di connessione a un database che dimostri la corretta gestione delle risorse usando l'interfaccia IDisposable e l'istruzione using. Creerai una classe che tiene traccia dell'apertura e della chiusura delle connessioni, assicurando che le risorse vengano sempre rilasciate correttamente.

Organizzerai il codice in due file:

  • DatabaseConnection.cs: crea una classe DatabaseConnection nello spazio dei nomi DataAccess che implementi IDisposable. La connessione dovrà:
    • Avere una proprietà ConnectionName (stringa, di sola lettura) impostata tramite il costruttore
    • Tenere traccia del fatto che la connessione sia stata eliminata usando un campo booleano privato
    • Stampare Connection opened: {ConnectionName} alla creazione dell'oggetto (nel costruttore)
    • Implementare il metodo Dispose() per stampare Connection closed: {ConnectionName} - ma solo se non è già stata eliminata (per evitare una doppia eliminazione)
    • Avere un metodo Query(string sql) che restituisca Executing on {ConnectionName}: {sql}
  • Program.cs: nel file principale, dimostra la corretta gestione delle risorse usando l'istruzione using con la connessione al database. Crea una connessione, esegui una query e lascia che il blocco using si occupi automaticamente della pulizia.

Riceverai due input:

  • Il nome della connessione (ad es., MainDB)
  • La query SQL da eseguire (ad es., SELECT * FROM Users)

Usa un'istruzione using per creare la connessione. All'interno del blocco, chiama il metodo Query e stampa il risultato. Quando il blocco using termina, Dispose() verrà chiamato automaticamente.

Ad esempio, se gli input sono MainDB e SELECT * FROM Users, l'output dovrebbe essere:

Connection opened: MainDB
Executing on MainDB: SELECT * FROM Users
Connection closed: MainDB

Nota come la connessione venga chiusa automaticamente quando il blocco using termina: non dovrai mai ricordarti di chiamare manualmente Dispose(). Questo schema assicura che le risorse vengano sempre ripulite, anche se si verifica un'eccezione all'interno del blocco!

Provalo tu

using System;
using DataAccess;

class Program
{
    public static void Main(string[] args)
    {
        string connectionName = Console.ReadLine();
        string sqlQuery = Console.ReadLine();
        
        // TODO: Usa un'istruzione 'using' per creare una DatabaseConnection
        // All'interno del blocco using:
        // 1. Chiama il metodo Query con sqlQuery
        // 2. Stampa il risultato del metodo Query
        // Il metodo Dispose verrà chiamato automaticamente al termine del blocco using
        
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C# online