[C#] gdi+ i zwalnianie zasobów

Ten kod wykona się natychmiast po wywołaniu Dispose() dla obiektu CustomControl. Proponujesz koledze tworzyć i zwalniać te obiekty przy każdym rysowaniu a odradzasz zwolnienie podczas destrukcji obiektu, obawiam się że nie znasz się nie tylko na C# a i na programowaniu jako takim.

wychodzi na to że masz rację. W takim radzie gdzie usunąć te obiekty

  1. Tworzyć i usuwać za pomocą using w OnPaint

  2. Utworzyć na poziomie klasy, usunąć w destruktorze

  3. Utworzyć na poziomie klasy, wywołać funkcję zwolnij w zdarzeniu OnClosed formy.

  4. Utworzyć na poziomie klasy, wywołać funkcję zwolnij w zdarzeniu OnClosing formy.

?

Alex, destruktor klasy Custom Control zostanie wywołany przy zamknięciu Formy?

Dobrze, że w php nie ma takich problemów :stuck_out_tongue:

Po pierwsze - ten kod nie wykona się automatycznie po wywołaniu metody Dispose obiektu CustomControl.

Po drugie - metodę Dispose obiektu CustomControl i tak trzeba będzie zawołać ręczenie, gdyż ta nie wykonuje się automatycznie po zamknięciu okna.

Racja, tych w tym przypadku nie.

A co ja napisałem?

Jakich ograniczonych? Ja o zarządzanych piszę ;]

athei , nie powinieneś robić tego w zdarzeniach Form. Kontrolka powinna być samodzielnym, hermetyzowanym tworem, a nie zależeć od innych klas.

Albo rób to w OnPaint albo w Dispose.

  • rozumiem
  • czyli? W OnPaint Dispose jest automatycznie() wywoływane poprzez instrukcję using. Mi chodzi o to, żeby nie tworzyć tych obiektów i usuwać na okrągło. Niech będą w użyciu tak długo jak animacja chodzi, jak zamknę formę z tą animacją chce się ich pozbyć.

Zmierz ile trwa utworzenie i zniszczenie tych obiektów, bo może się okazać, że trwa wystarczająco krótko.

Nie.

Ten niby destruktor jest finalizerem, co zresztą pisze w dokumentacji języka C#. Nie ma gwarancji jego wykonania a co za tym idzie, gwarancji zwolnienia zasobów.

Można w obsłudze tego zdarzenia, jednak należy pamiętać, że zamknięcie okna nie jest równoważne jego zniszczeniu. Okno możne być ponownie otwarte, jeżeli taka jest wola programisty.

Z tego powodu, zasoby najlepiej alokować nie w konstruktorze klasy a w przeciążonej metodzie Show.

Można, ale trzeba mieć świadomość, że w obsłudze tego zdarzenia można anulować zamknięcie okna. W takim przypadku nie powinno się zwalniać zasobów.

Finalizer nie będzie i nie może być wywołany zaraz po zamknięciu formy. Przecież możesz chcieć formę otworzyć ponownie.