Entwickler-Ecke

Basistechnologien - Freigabe von Unter-Objekten


Delete - Do 04.08.16 20:24
Titel: Freigabe von Unter-Objekten
- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Do 04.08.16 20:39

Ich gehe mal von Winforms aus.
Das Parent Control eines Controls ist üblicherweise für die Zerstörung zuständig. Wenn dein UnterControl in der Controls Collection deines eigentlichen Controls liegt wird das automatisch mit zerstört und es ist nichts weiter zu tun.
Wenn dein UnterControl wo anders geparented ist (warum auch immer) solltest du UnterControl.Parent auf null setzen und UnterControl selbst disposen.


Delete - Do 04.08.16 20:56

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Do 04.08.16 21:39

Schwer genau zu beantworten. Irgendein IDisposable Object kann man sicher so disposen.
Im Context der Frage aber so einfach nicht zu beantworten wenn es z.B. Abhängigkeiten gibt zwischen dem Control und deinem UnterControl bzw. UnterObjekt mußt du das berücksichtigen und eventuell auf Reihenfolgen achten oder bestimmte Beziehungen berücksichtigen (Dinge nullen, Events abhängen etc.)


Delete - Do 04.08.16 22:09

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Do 04.08.16 22:59

Zitat:
.NET macht es einem in dem Fall wirklich nicht leicht.


Dem kann ich insofern zustimmen das richtiges Dispose Handling manchmal schwierig ist. Dispose ist aber die Notlösung die man braucht weil .Net halt auch nur über einem ungemanagten System liegt. Sobald man die .Net Welt verlässt ist man leider oft gezwungen diese Kröte zu schlucken. In der idealen Welt (in der .Net Windows übernommen hätte) wäre Dispose weitestgehend ein Ding von gestern über das man nur noch lachen würde wie doof das war das man das früher häufiger brauchte. Der Finalizer wäre dann auch gleich mit gestorben.

Zitat:
bloß nicht dort freigeben, es kann dies und jenes passieren, weil der GC launisch ist".


Ich benutze den Finalizer eigentlich nie. Das typische Dispose Muster sieht zwar vor dort nochmal als letzte Verteidigungslinie Dispose aufzurufen aber das heißt ja das man zuvor was falsch gemacht hat wenn der Call wirklich nötig wird. Und wenn er benötigt wird hat man dann das Problem das der Finalizer irgendwann aufgerufen wird. Ein Dispose soll aber ungemanagte Resourcen absichern, und deren Freigabe soll deterministisch sein. Ich will nicht das ein File Handle, Connection oder eben auch ein UI Handle das Winforms dummerweise braucht irgendwann freigegeben wird. Durch das implementieren von Finalizer kann man eigentlich meist nur mehr falsch machen als richtig. Im Zweifel "don't touch it".