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.