Gewusst wie: Ausführen von Bereinigungscode mit finally (C#-Programmierhandbuch)

finally-Anweisungen sollen sicherstellen, dass die notwendige Bereinigung von Objekten, die externe Ressourcen enthalten, sofort erfolgen, auch wenn eine Ausnahme ausgelöst wird. Ein Beispiel für eine solche Bereinigung ist der Aufruf von Close auf einem FileStream sofort nach der Verwendung, anstatt abzuwarten, bis das Objekt durch die Common Language Runtime wie folgt speicherbereinigt wird:

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();
}

Beispiel

Um den vorherigen Code in eine try-catch-finally-Anweisung umzuwandeln, wird der Bereinigungscode wie folgt vom Arbeitscode getrennt.

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();
        }
    }
}

Da eine Ausnahme zu einem beliebigen Zeitpunkt innerhalb des try-Blocks vor dem OpenWrite()-Aufruf auftreten oder der OpenWrite()-Aufruf selbst fehlschlagen kann, ist nicht garantiert, dass die Datei geöffnet ist, wenn wir versuchen, sie zu schließen. Der finally-Block fügt eine Prüfung durch, um sicherzustellen, dass die FileStream-Objekt vor dem Aufruf der Methode Close nicht null entspricht. Ohne die null-Prüfung kann der finally-Block kann eine eigene NullReferenceException-Ausnahme auslösen. Das Auslösen von Ausnahmen in finally-Blöcken sollte allerdings, wenn möglich, vermieden werden.

Auch Datenbankverbindungen können mit einem finally-Block geschlossen werden. Da die Anzahl der zulässigen Verbindungen mit einem Datenbankserver manchmal begrenzt ist, sollten Sie Datenbankverbindungen so schnell wie möglich schließen. Wenn eine Ausnahme ausgelöst wird, bevor Sie die Verbindung schließen können, ist es besser, den finally-Block zu verwenden, als die Speicherbereinigung abzuwarten.

Siehe auch

C#-Programmierhandbuch
Ausnahmen und Ausnahmebehandlung
Ausnahmebehandlung
using-Anweisung
try-catch
try-finally
try-catch-finally