Törlési kód végrehajtása végül
Az utasítás célja finally
annak biztosítása, hogy az objektumok, általában a külső erőforrásokat tartalmazó objektumok szükséges tisztítása azonnal megtörténjen, még akkor is, ha kivétel történik. Ilyen törlésre példa az, ha közvetlenül a használat után hívja CloseFileStream meg az objektumot ahelyett, hogy arra várna, hogy a közös nyelvi futtatókörnyezet által összegyűjtött szemét legyen, az alábbiak szerint:
static void CodeWithoutCleanup()
{
FileStream? file = null;
FileInfo fileInfo = new FileInfo("./file.txt");
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
file.Close();
}
Példa
Az előző kód utasítássá alakításához try-catch-finally
a törlési kód a következőképpen lesz elválasztva a munkakódtól.
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();
}
}
Mivel a hívás előtt OpenWrite()
bármikor előfordulhat kivétel a try
blokkon belül, vagy maga a OpenWrite()
hívás meghiúsulhat, nem garantáljuk, hogy a fájl meg van nyitva, amikor megpróbáljuk bezárni. A finally
blokk egy ellenőrzést ad hozzá annak ellenőrzéséhez, hogy az FileStream objektum nem null
szerepel-e a metódus meghívása Close előtt. Az ellenőrzés nélkül a null
finally
blokk a sajátját NullReferenceExceptionis eldobhatja, de ha lehetséges, kerülni kell a kivételeket a blokkokban finally
.
Az adatbázis-kapcsolat egy másik jó lehetőség arra, hogy egy blokkban finally
lezárják. Mivel az adatbázis-kiszolgálóhoz engedélyezett kapcsolatok száma néha korlátozott, a lehető leggyorsabban be kell zárnia az adatbázis-kapcsolatokat. Ha kivételt jelez a kapcsolat bezárása előtt, a finally
blokk használata jobb, mint a szemétgyűjtésre várni.