Metoda Dispose a destruktor

0

Cześć, zastanawia mnie to już od jakiegoś czasu, ale wstydziłem się zapytać ;)

Powiedzmy, że jest sobie klasa "MyClass". I ta klasa korzysta z obiektu MemoryStream.

I teraz pytanie jest takie. Jaka jest różnica pomiędzy:

  1. Strumień usuwam (stream.Dispose()) po prostu w destruktorze klasy MyClass
  2. MyClass implementuje IDisposable i strumień jest usuwany w metodzie Dispose().
3

Różnica jest taka, że o tym kiedy wywołany zostanie destruktor decyduje GC, który jest niedeterministyczny.

Jak kończysz pracę z plikiem, albo zapytanie na bazie to raczej chcesz zamknąć plik/połączenie od razu, a nie kiedyś tam w przyszłości, kiedy GC uzna, że pora na sprzątnięcie.

W ogóle to jest o tym pełno informacji na stacku, więc zamiast się długo zastanawiać mogłeś po prostu poszukać :P

2

Destruktor powinien być tylko „na wszelki wypadek”, gdyby programista zapomniał wywołać Dispose, dzięki temu unikamy wycieków zasobów.

0

I jeszcze jedna sprawa: w finalizerze nie znasz stanu innych obiektów zarządzalnych zatem możesz zwalniać tylko zasoby niezarządzalne.

0

Zawsze dla pewności możesz opakować tworzenie obiektu w - "using (Object obj = new Object())" - samo wywoła metodę Dispose jak zaimplementujesz interfejs IDisposable w klasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1