Garbage Collector – Sprawdzanie kiedy sąsiad wyrzuca śmieci.

Garbage Collector ma zaimplementowaną pewną funkcjonalność. Daje nam ona kontrolę nad procesem niszczenia obiektów. Jako że do zarządzania pamięcią wykorzystywany jest specjalny agent i nie musimy się martwić o niszczenie obiektów. Tym samym nie wiemy, kiedy to nastąpi.

Użycie finalizatorów spowoduje możliwość uchwycenia procesu niszczenia obiektu w metodzie.

Działanie

DisposeGarbage Collector skanując obiekty przeznaczone do niszczenia, inaczej traktuje obiekty zawierające finalizator. Umieszcza je na specjalnej kolejce obiektów nieosiągalnych (ang. freachable quaque).

Zawartość kolejki jest przetwarzana, i proces niszczenia obiektu jest delegowany do metody: protected override void Finalize().

Zwalnianie pamięci w ten sposób jest czasochłonne, dlatego należy go używać z rozwagą i w zasadzie powinno się stosować tylko do specyficznych sytuacji:

  • otwartych połączeń sieciowych,
  • połączeń do bazy danych,
  • otwartych plików,
  • użytych bibliotek spoza .NET półświatka,
  • obiektów COM (Component Object Model).

Finalizatory można używać jedynie w klasach i tylko jedno wystąpienie na klasę.

Finalizujemy jedynie obszary niezarządzanego kodu.

 

Jak użyć?

Szkielet metody Finalize.

 

Możemy oczywiście użyć składni podobnej do jęcyka C++, czyli destruktora. Jednak będzie on przez kompilator zamieniony na metodę Finalize.

 

Wykorzystanie interfejsu IDisposable

Do poprawnego użycia finalizatorów wykorzystamy interfejs IDisposable.

Poniżej znajduje się szkielet implementacji użycia IDisposable.

 

Metoda Dispose może zostać wywołana z obiektu. Jest ona także wymagana, by wykorzystać dyrektywę języka using.

W takiej składni metoda Dispose z interfejsu IDisposable zostanie wywołana przez dyrektywę using.

W przypadku braku implementacji interfejsu IDisposable przez klasę, będziemy mieli błąd kompilacji.

 

C.D.N.