Share via


Opschoningscode uitvoeren met ten slotte

Het doel van een finally instructie is ervoor te zorgen dat de benodigde opschoonbewerking van objecten, meestal objecten die externe resources bevatten, onmiddellijk plaatsvindt, zelfs als er een uitzondering wordt gegenereerd. Een voorbeeld van een dergelijke opschoonactie is dat er onmiddellijk na gebruik wordt aangeroepen CloseFileStream in plaats van te wachten totdat het object door de algemene taalruntime wordt verzameld, als volgt:

static void CodeWithoutCleanup()
{
    FileStream? file = null;
    FileInfo fileInfo = new FileInfo("./file.txt");

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

    file.Close();
}

Opmerking

Als u de vorige code wilt omzetten in een try-catch-finally instructie, wordt de opschoningscode als volgt gescheiden van de werkende code.

static void CodeWithCleanup()
{
    FileStream? file = null;
    FileInfo? fileInfo = null;

    try
    {
        fileInfo = new FileInfo("./file.txt");

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

Omdat een uitzondering op elk gewenst moment binnen het try blok kan optreden voordat de OpenWrite() oproep wordt aangeroepen, of de OpenWrite() aanroep zelf kan mislukken, wordt niet gegarandeerd dat het bestand is geopend wanneer we proberen het te sluiten. Het finally blok voegt een controle toe om ervoor te zorgen dat het FileStream object zich niet null bevindt voordat u de Close methode aanroept. Zonder de null controle kan het finally blok een eigen NullReferenceExceptionblok genereren, maar het genereren van uitzonderingen in finally blokken moet worden vermeden als dit mogelijk is.

Een databaseverbinding is een andere goede kandidaat om in een finally blok te worden gesloten. Omdat het aantal verbindingen dat is toegestaan voor een databaseserver soms beperkt is, moet u databaseverbindingen zo snel mogelijk sluiten. Als er een uitzondering wordt gegenereerd voordat u de verbinding kunt sluiten, is het gebruik van het finally blok beter dan wachten op garbagecollection.

Zie ook