Gewusst wie: Ausführen von Bereinigungscode mit finally (C#-Programmierhandbuch)How to: Execute Cleanup Code Using finally (C# Programming Guide)

finally-Anweisungen sollen sicherstellen, dass die notwendige Bereinigung von Objekten, die externe Ressourcen enthalten, sofort erfolgen, auch wenn eine Ausnahme ausgelöst wird.The purpose of a finally statement is to ensure that the necessary cleanup of objects, usually objects that are holding external resources, occurs immediately, even if an exception is thrown. 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:One example of such cleanup is calling Close on a FileStream immediately after use instead of waiting for the object to be garbage collected by the common language runtime, as follows:

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

BeispielExample

Um den vorherigen Code in eine try-catch-finally-Anweisung umzuwandeln, wird der Bereinigungscode wie folgt vom Arbeitscode getrennt.To turn the previous code into a try-catch-finally statement, the cleanup code is separated from the working code, as follows.

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.Because an exception can occur at any time within the try block before the OpenWrite() call, or the OpenWrite() call itself could fail, we are not guaranteed that the file is open when we try to close it. Der finally-Block fügt eine Prüfung hinzu, um sicherzustellen, dass das FileStream-Objekt nicht null ist, bevor Sie die Close-Methode aufrufen.The finally block adds a check to make sure that the FileStream object is not null before you call the Close method. 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.Without the null check, the finally block could throw its own NullReferenceException, but throwing exceptions in finally blocks should be avoided if it is possible.

Auch Datenbankverbindungen können mit einem finally-Block geschlossen werden.A database connection is another good candidate for being closed in a finally block. Da die Anzahl der zulässigen Verbindungen mit einem Datenbankserver manchmal begrenzt ist, sollten Sie Datenbankverbindungen so schnell wie möglich schließen.Because the number of connections allowed to a database server is sometimes limited, you should close database connections as quickly as possible. 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.If an exception is thrown before you can close your connection, this is another case where using the finally block is better than waiting for garbage collection.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Ausnahmen und AusnahmebehandlungExceptions and Exception Handling
AusnahmebehandlungException Handling
Using-Anweisungusing Statement
try-catchtry-catch
try-finallytry-finally
try-catch-finallytry-catch-finally