Udostępnij za pośrednictwem


Porady: wykonywanie czyszczenia kodu za pomocą instrukcji finally (Przewodnik programowania w języku C#)

Celem finally instrukcji jest zapewnić niezbędne Oczyszczanie obiektów, zwykle w przypadku obiektów, które mają w posiadaniu zasobów zewnętrznych, następuje natychmiast, nawet wtedy, gdy jest wyjątek.Przykładem takiego oczyszczania jest wywołaniem Close na FileStream bezpośrednio po użyciu zamiast czekać na obiekt, aby być garbage zebrane przez common language runtime w następujący sposób:

static void CodeWithoutCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

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

    file.Close();
}

Przykład

Aby włączyć poprzedniego kodu do try-catch-finally instrukcji, kod porządkujący jest oddzielona od kodu pracy w następujący sposób.

static void CodeWithCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = null;

    try
    {
        fileInfo = new System.IO.FileInfo("C:\\file.txt");

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

Ponieważ wyjątek może występować w dowolnym momencie w try zablokować przed OpenWrite() zadzwonić, lub OpenWrite() samo w sobie może zakończyć się niepowodzeniem, firma Microsoft nie są gwarantowane plik jest otwarty, gdy próbujemy go zamknąć.finally Bloku dodaje wyboru, aby upewnić się, że FileStream obiektu nie jest null przed wywołaniem Close metody.Bez null sprawdzić, finally bloku może zgłosić swój własny NullReferenceException, ale wyrzucanie wyjątków finally powinno się unikać bloków, jeśli jest to możliwe.

Połączenie z bazą danych jest zamykane innym dobrym kandydatem finally bloku.Liczby połączeń dozwolonych na serwerze bazy danych czasami jest ograniczony, dlatego należy zamykać połączenia bazy danych najszybciej jak to możliwe.Jeśli wyjątek jest przed zamknięciem połączenia, jest to innym przypadku w przypadku, gdy za pomocą finally bloku jest lepszy niż oczekiwanie na wyrzucania elementów bezużytecznych.

Zobacz też

Informacje

Wyjątki i obsługa wyjątków (Przewodnik programowania w języku C#)

Obsługa wyjątków (Przewodnik programowania w języku C#)

using — Instrukcja (odwołanie w C#)

try-catch (odwołanie w C#)

try-finally (odwołanie w C#)

try-catch-finally (odwołanie w C#)

Koncepcje

Przewodnik programowania w języku C#