Procedura: eseguire codice di pulitura mediante finally (Guida per programmatori C#)

Lo scopo di un'istruzione finally è quello di garantire che venga eseguita immediatamente l'opportuna pulitura degli oggetti, in genere quelli che contengono risorse esterne, anche se viene generata un'eccezione. Un esempio di questo tipo di pulitura consiste nel chiamare Close su un oggetto FileStream immediatamente dopo l'utilizzo anziché attendere che venga sottoposto alla Garbage Collection da Common Language Runtime, come indicato di seguito:

static void CodeWithoutCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

    file = fileInfo.OpenWrite();
    file.WriteByte(0xF);

    file.Close();
}

Esempio

Per trasformare il codice precedente in un'istruzione try-catch-finally, il codice di pulitura viene separato dal codice effettivo, come indicato di seguito.

static void CodeWithCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = null;

    try
    {
        fileInfo = new System.IO.FileInfo("C:\\file.txt");

        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    catch(System.UnauthorizedAccessException e)
    {
        System.Console.WriteLine(e.Message);
    }
    finally
    {
        if (file != null)
        {
            file.Close();
        }
    }
}

Poiché è possibile che in qualsiasi momento si verifichi un'eccezione all'interno del blocco try prima della chiamata OpenWrite() o che la chiamata a OpenWrite() non riesca, non esiste alcuna garanzia che il file sia aperto quando si tenta di chiuderlo. Il blocco finally aggiunge un controllo per verificare che l'oggetto FileStream non sia null prima della chiamata al metodo Close. Senza il controllo di null, il blocco finally potrebbe infatti generare un'eccezione specifica NullReferenceException ma la generazione di eccezioni in blocchi finally è da evitare, se possibile.

Una connessione a un database rappresenta un altro elemento ideale da chiudere in un blocco finally. Poiché il numero di connessioni consentite a un server database è talvolta limitato, è importante chiudere le connessioni il più rapidamente possibile. Se viene generata un'eccezione prima della chiusura di una connessione, anche in questo caso è preferibile utilizzare il blocco finally anziché attendere il processo di Garbage Collection.

Vedere anche

Riferimenti

Eccezioni e gestione delle eccezioni (Guida per programmatori C#)

Gestione delle eccezioni (Guida per programmatori C#)

Istruzione using (Riferimenti per C#)

try-catch (Riferimenti per C#)

try...finally (Riferimenti per C#)

try...catch...finally (Riferimenti per C#)

Concetti

Guida per programmatori C#