Megosztás a következőn keresztül:


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 nullfinally 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.

Lásd még