Było o konstruktorze, to teraz pokażę Wam destruktor klasy w języku C#. Czym on jest? Do czego on służy? Jaką ukrywa tajemnicę? Wszystko po kolei zostanie wyjaśnione najprościej jak się tylko da.

DESTRUKTOR KLASY W JĘZYKU C# NIE DZIAŁA JAK W C++!

Zanim rozpoczniemy, delikatna prośba. Nie utożsamiajcie destruktora w języku C# z destruktorem znanym z języka C++! Tu jest zupełnie inny mechanizm! Można rzec, że w "CSharpie" pojęcie "destruktor" to tylko kwestia umowna, bo za tym kryje się coś innego. Ale odkrycie tej tajemnicy zostawię Wam na deser. Najpierw teoria.

CO TO JEST DESTRUKTOR?

Destruktor występuje w roli metody, takiej jak sam konstruktor działający w drugą stronę. Wywoływany jest automatycznie w momencie, kiedy obiekt zostaje uznany za niepotrzebny i trzeba go usunąć, żeby zyskać na wolnej pamięci. C# poszedł w tym wypadku znowu śladami Javy i sam odpowiada za kontrolowanie pamięci w programie, żeby programista nie musiał się martwić obsługą wskaźników.

JAK UTWORZYĆ DESTRUKTOR?

Kojarzycie jak wygląda to w języku C++? Destruktor klasy w języku C# NICZYM od niego nie odstaje (od strony wyglądu). Projektuje się go jak konstruktor, tylko...z dodatkowym znakiem tyldy wpisanym przed nazwą:

~MyClass()
{
	// instrukcje
}

Nie podaje się z zasady modyfikatora dostępu, gdyż on niczego nie wnosi do kodu źródłowego. C# i tak go wywoła kiedy na obiekt "przyjdzie czas". Ponadto, w przeciwieństwie do konstruktora, destruktor nie przyjmuje żadnych parametrów!

SEKRET DZIAŁANIA DESTRUKTORA W "CSHARPIE"

OK. Przechodzimy już do sedna sprawy. Destruktor klasy w języku C# to jest de facto wywołanie innej metody głęboko zaszytej dla początkujących oczu, "Finalize". Dowiadując się o języku C# zapewne już wiecie, że zaopatrzony jest w tzw. "Garbage Collector" po polsku nazywany "odśmiecaczem". To on stoi za dbanie o prawidłową alokację pamięci i zwalnianie jej gdy w grę wchodzą wszelkie byty umieszczane na stercie np. obiekty, które przechowują w zmiennej referencję. Kiedy ma dojść do zniszczenia obiektu, wtedy do akcji wkracza odśmiecacz, który wykonuje swoje czynności, a ze strony klasy "do głosu" dochodzi destruktor, o ile został on zdefiniowany.

KLASA "MYCLASS"
using System;

class MyClass
{
	~MyClass()
	{
		Console.WriteLine("Obiekt został zniszczony.");
	}
}
KLASA "PROGRAM"
class Program
{
	static void Main(string[] args)
	{
		MyClass mc = new MyClass();

		Console.ReadKey();
	}
}

Możecie mieć problem z zobaczeniem efektu. Jeśli nie widzicie działania destruktora, to mnie pomogło przejście na typ "Release" budowy projektu. O ile w "Visual Studio" to kwestia przełączenia się za pomocą dwóch kliknięć (przycisk "Konfiguracja rozwiązania" na lewo od przycisku uruchamiania kompilacji), to w całej reszcie innych środowisk musicie już pokombinować sami.

Gdyby nadal nie było widać komunikatu, to możecie skorzystać z metody "GC.Collect()", która wymusi na odśmiecaczu "przeczesanie" pamięci celem wyszukania wyrzutków i pozbycia się ich dla odzyskania pamięci. Powinna jednak być wywoływana w granicach zdrowego rozsądku, bo to obciąża zasoby:

MyClass mc = new MyClass();

GC.Collect();
Console.ReadKey();

Uwaga! Natrafiłem na teorię, że destruktor klasy w języku C# nie powinien być definiowany na wyrost, tylko po to żeby stał pusty. Podobno może niekorzystnie wpłynąć to na wydajność aplikacji! Nie zostało to przeze mnie jednoznacznie potwierdzone.

Destruktor klasy w języku C#

Destruktor klasy w języku C# jest tak naprawdę aliasem metody "Finalize", która odpowiada za czyszczenie pamięci po niepotrzebnym już obiekcie.


Może być tak, że destruktory wcale nie będą Wam potrzebne podczas całej ścieżki nabywania wiedzy ze znajomości "CSharpa". Mimo wszystko, czułem się w obowiązku Wam je przedstawić. Jedynym prawdziwym usprawiedliwieniem może być sytuacja, w której pewne niestandardowe implementacje wymagają ręcznego zwolnienia pamięci. Zaznaczam lojalnie, że "Garbage Collector" uwzględnia tylko te obiekty, które zostały utworzone przy pomocy słowa kluczowego "new"!

PODOBNE ARTYKUŁY