Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przypadku większości obiektów tworzonych przez aplikację można polegać na śmiecniku pamięci platformy .NET do 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 mechanizm odśmiecania pamięci może śledzić żywotność obiektu, który enkapsuluje niezarządzany zasób, nie wie, jak zwolnić i wyczyścić niezarządzany zasób.
Jeśli typy korzystają z zasobów niezarządzanych, należy wykonać następujące czynności:
Zaimplementuj wzorzec usuwania. Wymaga to udostępnienia IDisposable.Dispose implementacji, aby umożliwić deterministyczne zwolnienie niezarządzanych zasobów. Użytkownik typu wywołuje Dispose, gdy obiekt (oraz zasoby, które wykorzystuje) nie są już potrzebne. Metoda Dispose natychmiast zwalnia niezarządzane zasoby.
W przypadku, gdy użytkownik typu zapomni wywołać Dispose, zaproponuj sposób na zwolnienie niezarządzanych zasobów. Istnieją dwa sposoby, aby to zrobić:
Użyj bezpiecznego uchwytu, aby opakowować niezarządzany zasób. Jest to zalecana technika. Bezpieczne uchwyty pochodzą z klasy abstrakcyjnej System.Runtime.InteropServices.SafeHandle i zawierają niezawodną Finalize metodę. Kiedy używasz bezpiecznego uchwytu, po prostu zaimplementuj interfejs IDisposable i wywołaj metodę Dispose swojego bezpiecznego uchwytu w implementacji IDisposable.Dispose. Finalizator bezpiecznego uchwytu jest wywoływany automatycznie przez garbage collector, jeśli metoda Dispose nie jest wywoływana.
—lub —
Zdefiniuj finalizator. Finalizacja umożliwia niedeterministyczne zwalnianie niezarządzanych zasobów, gdy konsument typu nie wywoła IDisposable.Dispose w celu ich deterministycznego usunięcia.
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 twojego typu mogą następnie wywoływać implementację IDisposable.Dispose bezpośrednio w celu zwolnienia pamięci używanej przez niezarządzane zasoby. Gdy prawidłowo zaimplementujesz metodę Dispose, metoda bezpiecznego uchwytu Finalize lub własna zastąpiona metoda Object.Finalize staje się zabezpieczeniem do oczyszczania zasobów w przypadku, gdy metoda Dispose nie jest wywoływana.
W tym dziale
Implementowanie metody Dispose opisuje sposób implementowania wzorca usuwania na potrzeby zwalniania niezarządzanych zasobów.
Używanie 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ć.
Źródło
Typ / Członek | 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 zwyczajowo wywoływana z metody Dispose , aby uniemożliwić wykonanie finalizatora. |