Menu
Coddy logo textTech

Using vs. try-finally

Fa parte della sezione Logica e flusso del percorso C# di Coddy. Lezione 28 di 66.

Sia le istruzioni using sia i blocchi try-finally aiutano a gestire le risorse che devono essere rilasciate correttamente. L'istruzione using offre un modo più pulito e conciso per assicurarsi che gli oggetti IDisposable vengano ripuliti correttamente.

Nota: using sostituisce il modello try-finally per il rilascio delle risorse. Non sostituisce try-catch. Puoi comunque racchiudere un blocco using all'interno di un try-catch per gestire le eccezioni.

Per prima cosa, diamo un’occhiata all’approccio try-finally:

StreamReader reader = null;
try
{
    reader = new StreamReader("file.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

L'istruzione using semplifica questo codice:

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

L'istruzione using chiama automaticamente Dispose() quando si esce dal blocco, anche se si verifica un'eccezione.

Che cos'è StreamReader?
StreamReader è una classe usata per leggere testo dai file. Ne crei una passando un nome di file e apre il file per la lettura. Implementa IDisposable, quindi deve essere chiusa correttamente dopo l'uso, ed è proprio questo che using gestisce per te.

Metodi comuni di StreamReader:

  • ReadToEnd(): legge l'intero file come un'unica stringa
  • ReadLine(): legge una riga alla volta, restituisce null quando viene raggiunta la fine del file

Per contare le righe in un file, puoi usare un ciclo ReadLine():

using (StreamReader reader = new StreamReader("file.txt"))
{
    int lineCount = 0;
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
    Console.WriteLine(lineCount);
}

Puoi anche combinare using con try-catch per gestire eccezioni come quella di un file mancante:

try
{
    using (StreamReader reader = new StreamReader("file.txt"))
    {
        int lineCount = 0;
        while (reader.ReadLine() != null)
        {
            lineCount++;
        }
        Console.WriteLine(lineCount);
    }
}
catch (FileNotFoundException)
{
    Console.WriteLine("File not found");
}
challenge icon

Sfida

Facile

Crea un metodo chiamato processFile che:

  1. Accetti un nome di file come parametro stringa
  2. Usi l'istruzione using con un StreamReader per leggere tutte le righe dal file
  3. Restituisca il numero di righe nel file
  4. Se si verifica una FileNotFoundException, stampi "File not found" e restituisca -1

Provalo tu

using System;
using System.IO;

class ProcessFile
{
    public static int processFile(string filename)
    {
        // Scrivi il tuo codice qui
    }
}
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 Logica e flusso

Esercitati da solo: Compilatore C# online