Czyszczenie zasobów niezarządzanych

W przypadku większości obiektów tworzonych przez aplikację można polegać na modułze odśmiecania pamięci platformy .NET do obsługi zarządzania pamięcią. Jednak podczas tworzenia obiektów zawierających zasoby niezarządzane należy jawnie zwolnić te zasoby po zakończeniu korzystania z nich. Najczęściej używane typy zasobów niezarządzanych to obiekty, które opakowują zasoby systemu operacyjnego, takie jak pliki, okna, połączenia sieciowe lub połączenia z bazą danych. Mimo że moduł odśmiecania pamięci jest w stanie śledzić okres istnienia obiektu hermetyzującego niezarządzany zasób, nie ma informacji, jak zwolnić i wyczyścić niezarządzany zasób.

Jeśli typy w aplikacji używają niezarządzanych zasobów, należny wykonać następujące czynności:

  • Zaimplementuj wzorzec usuwania. Wymaga to udostępnienia IDisposable.Dispose implementacji w celu umożliwienia deterministycznej wersji niezarządzanych zasobów. Użytkownik typu wywołuje wywołania Dispose obiektu (i używanych zasobów) nie jest już potrzebny. Metoda Dispose natychmiast zwalnia niezarządzane zasoby.

  • W przypadku, gdy użytkownik typu zapomni wywołać Disposemetodę , zapewni sposób na zwolnienie niezarządzanych zasobów. Istnieją dwa sposoby wykonania tej czynności:

    • Użycie bezpiecznego dojścia w celu umieszczenie niezarządzanego zasobu w otoce. Jest to zalecana technika. Sejf uchwyty pochodzą z klasy abstrakcyjnej System.Runtime.InteropServices.SafeHandle i zawierają niezawodną Finalize metodę. Gdy używasz bezpiecznego uchwytu IDisposable , wystarczy zaimplementować interfejs i wywołać metodę bezpiecznego uchwytu Dispose w IDisposable.Dispose implementacji. Finalizator bezpiecznego uchwytu jest wywoływany automatycznie przez moduł odśmiecający pamięci, jeśli jego Dispose metoda nie jest wywoływana.

      lub

    • Zdefiniuj finalizator. Finalizacja umożliwia niedeterministyczne wydanie niezarządzanych zasobów, gdy odbiorca typu nie może wywołać IDisposable.Dispose usunięcia ich deterministycznie.

      Ostrzeżenie

      Finalizacja obiektów może być złożoną i podatną na błędy operacją. Zalecamy użycie bezpiecznego uchwytu zamiast udostępniania własnego finalizatora.

Użytkownicy typu mogą następnie wywoływać implementację IDisposable.Dispose bezpośrednio w celu zwolnienia pamięci używanej przez niezarządzane zasoby. W przypadku prawidłowego Dispose zaimplementowania metody metoda bezpiecznego dojścia Finalize lub własnego zastąpienia Object.Finalize metody staje się zabezpieczeniem w celu oczyszczenia zasobów w przypadku, gdy Dispose metoda nie jest wywoływana.

W tym obszarze

Implementowanie metody Dispose opisuje sposób implementowania wzorca usuwania na potrzeby zwalniania niezarządzanych zasobów.

Użycie obiektów implementujących IDisposable opisuje sposób, w jaki konsumenci typu zapewniają, że jego Dispose implementacja jest wywoływana. Zdecydowanie zalecamy użycie instrukcji języka C# using (lub Visual Basic Using), aby to zrobić.

Odwołanie

Typ/element członkowski opis
System.IDisposable Definiuje metodę Dispose zwalniania niezarządzanych zasobów.
Object.Finalize Zapewnia finalizację obiektów, jeśli niezarządzane zasoby nie są zwalniane przez metodę Dispose .
GC.SuppressFinalize Pomija finalizację. Ta metoda jest niestandardowie wywoływana z Dispose metody, aby uniemożliwić wykonanie finalizatora.