hallo,
mit GC.Collect(); sage ich dem GC, dass er sich, sorry, vedammt noch mal die Zeit nehmen soll.
Bei mir scheint es tatsächlich so, dass sich eine
foreach (clsB tmpB in clsA.getBs()) {
// ... tolle Sachen mit tmpB
}
// getBs liefert eine Hashtable auf clsBs zurück :-)
den Verweis hält, obwohl ich ausserhalb und nach der Klammer zerstöre.
Zumindest räumt der GC ohne _foreach _schon mal besser auf. !?
vega
ja, die Klassen sind alle disposable.
ich habe es in einem kleinen Projekt probiert.
Der ganze Baum wird sauber zerstört !?
(übrigens unabhängig von Dispose() )
Ich weiß nicht, wo mein Fehler lag.
Irgendwo muss ein Verweis auf einen Knoten stehen geblieben sein.
what ever ...
danke!
ah! danke,
das verstehe ich!
macht Sinn 🙂
danke!
P.P.S:
ABER
ich setze jetzt meine Klasse (intern die Hashtable) zum löschen auf null.
Der Destructor wird auch aufgerufen und setzt (unnötig) die interne Hashtable auf null.
Mit dem nächsten GC.Collect() werden aber NICHT die Objekte in der Hashtable zerstört,
wie ich es erwartet hätte!?
Sondern erst beim verlassen des Programms.
!?
PS:
ich habe es ausprobiert in einem Test-Projekt:
nach dem Nullsetzen der Hashtable passiert erst mal nix,
weil sich der GC sich noch nicht genötig sieht.
Nach GC.Collect() werden sofort alle Objekte wild durcheinander
zerstört. cool!
danke Euch!
vega
Original von tscherno
Ich habe das Objekt welches die Daten repräsentiert auf null gesetzt und anschließend mit GC.Collect() einsameln lassen.
Hallo zusammen,
ich setze jetzt die Hashtable auf Null und rufe GC.Collect() auf.
Nachdem damit alle Verweise auf meine Objekte weg sind, gehe ich davon aus, dass der GC alles aufräumt.
danke Euch!
vegaS
Original von herbivore
ich hatte ja nun extra ausgeschrieben, was DAL heißt.
danke! 🙂 Das habe ich schon gesehen und gesucht.
Im Moment scheint für mich ein Data Abstraction Layer einfach nur eine Sammlung von Methoden (also eine zusätzliche Schicht) zu sein, die mich vor den "bösen" Datenbank-Funktionen und dem "bösen" SQL schützen.
Ich verstehe den Sinn noch nicht, dem einen Namen und eine Schicht zu geben.
Ist das einfach nur eine Klasse, die eine Funktion "Speichere Stamm", eine Funktion "Speichere Ast" und eine Funktion "Speichere Blatt" enthält? - Alle inc. der jeweiligen SQL-Befehle und den DB-Zugriffen ...
Könntest Du mir einen Link senden, in dem dieses Thema erklärt wird?
Es muss doch mehr dahinter sein, wenn das so einen komplizierten Namen hat !?
danke
vage
Hallo zusammen,
reicht es zum zerstören einer Hashtable mit komplexen Objekten, die Hashtable auf Null zu setzen
oder muss man zuerst mit foreach jedes Objekt zerstören? (auf Null setzen, Disposen)
Ich meine, wenn ich zügig und unabhängig vom Garbage-Collector zerstören will.
Wo kann man so etwas nachlesen - oder, wie kann man es ausprobieren?
Meine Anwendungen bleiben oft längere Zeit relativ "speicherfressend / -reservierend".
Ich weiß keine keinen Ansatz, dass Objekte-zerstören vernünftig zu kontrollieren.
Der schlaue Garbage-Collector macht irgendwas, irgendwann!?
danke
vega
ok, vielen Dank!
Mit DAL komme ich im Moment noch nicht weiter,
nicht mal Wikipedia liefer eine vernünftige Zusammenfassung oder Info.
Ich stelle es mir im Moment so vor, dass ich von meinem "Klassen-Baum" eine Klasse "Speicherbarer Baum" ableite,
die neben allen Funktionen meines Baumes (Struktur) auch das speichern in die Datenbank anbietet.
Aber ich werd's mir ansehen!
vega
danke,
also einfach nur Baum 🙂 wie passend 🙂)
Aber wie meinst Du das mit "alle gleich"?
Die Eigenschaften und Methoden eines Blattes sind doch ganz anders,
als die eines Astes.
Das eine hat eine Größe, eine Farbe, kann welk sein und fallen.
Das andere hat eine Dicke, eine Länge und vielleicht ein Spechten-Nest.
Das kann doch nicht gleich sein!?
Wie unterscheidet man dann?
Würdest Du die Serialisierung (in die Datenbank) einer solchen Klasse (Stamm, Ast und Batt)
in der jeweiligen Klasse ausprogrammieren - oder in einer übergeordneten Klasse oder in der Klasse "Stamm" (in der alle Unterobjekte bekannt sind)
vega