Sdílet prostřednictvím


Jak provést vyčištění kódu pomocí příkazu finally

Účelem finally příkazu je zajistit, aby se zajistilo, že nezbytné vyčištění objektů, obvykle objektů, které uchovávají externí prostředky, dojde okamžitě, i když dojde k výjimce. Jedním z příkladů takového vyčištění je volání CloseFileStream okamžitě po použití místo čekání na uvolnění objektu z paměti modulu CLR (Common Language Runtime), jak je znázorněno níže:

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

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

    file.Close();
}

Příklad

Chcete-li převést předchozí kód na try-catch-finally příkaz, je kód vyčištění oddělen od pracovního kódu následujícím způsobem.

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

Vzhledem k tomu, že v rámci bloku před OpenWrite() voláním může dojít k try výjimce nebo OpenWrite() samotné volání může selhat, nezaručujeme, že je soubor otevřený, když se ho pokusíme zavřít. Blok finally přidá kontrolu, abyste se ujistili, že FileStream objekt není null před voláním Close metody. null Bez kontroly by blok mohl vyvolat vlastní NullReferenceException, ale pokud je to možné, finally měly by se vyhnout vyvolání výjimek v finally blocích.

Připojení k databázi je dalším vhodným kandidátem finally na uzavření v bloku. Vzhledem k tomu, že počet připojení povolených k databázovému serveru je někdy omezený, měli byste připojení k databázi co nejrychleji zavřít. Pokud se před ukončením připojení vyvolá výjimka, je použití finally bloku lepší než čekání na uvolňování paměti.

Viz také