Wie nennen Destruktor in C # XNA
Ich habe ein Objekt, und wollen einfach nur zu zerstören, es auf irgendein Ereignis. So rufen Sie den Destruktor in XNA?
InformationsquelleAutor Nasgharet | 2011-06-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Legen Sie das Objekt auf
null
und der Garbage Collector wird es abholen auf den nächsten Lauf.Als eine Randnotiz, wenn das Objekt etwas ist, das Sie erstellen, wird oft (Feinde, Kugeln etc..), dann haben Sie möglicherweise verwenden möchten, ein pool statt löschen Sie das Objekt. Dies würde bedeuten, dass das Objekt wiederverwendet wird und somit vom garbage collector aufgerufen wird, weniger oft die Leistung steigern.
der Grund, warum es nicht funktioniert in deinem Fall ist, dass der event-handler ist, halten Sie das Objekt in Umfang, da die Veranstaltung nie ungebunden vor dem Objekt. Sie müssen call -= entfernen der Fall, bevor es abgeholt wird.
Berardi - Nein, es muss nicht eine sofortige Wirkung auf das Gedächtnis. Die Frage war, um das Objekt zu zerstören (d.h. Sie verlieren-Referenz) in das Spiel (da es
XNA
). Die IDisposable-pattern ist sicherlich gültig für die Entfernung, aber OP war nicht besorgt mit dem Speicher entfernen, eher die Zerstörung des Objektes. Zwingt die GC ist leichtsinnig in ein Echtzeit-Spiel (esp auf XBox/WP7) undpooling
ist immer noch besser alsdisposing
(common objs).Es gibt keine Notwendigkeit, um alsnull
aus einem Speicher Perspektive unbedingt, aber es hilft, wenn Sie versuchen zu entfernen, einen Feind aus dem Spiel. Als würde eine Kugel außerhalb des Bereichs automatisch?Was du redest ist design-überlegungen nicht die Reinigung des Gedächtnisses, und 2. das Beispiel gab er nie frei die
dym
Objekt, bis dergameTime
Objekt wurde freigegeben, weil der starke Referenz erzeugt, die durch den event-handler. Dies ist ein häufiges problem von event-driven-Modellen führen, so dass selbst wenn Sie esnull
es nicht habe freigegeben, bisgameTime
freigegeben wird.Berardi - ich denke, wir cross-wired. Ich nahm an, der OP fragte es aus einer Perspektive zu bekommen, entfernen Sie ein Objekt aus dem Spiel, die nicht unbedingt aus dem Speicher POV. Das ist, warum ich vorgeschlagen, pooling, vor allem, wenn Sie gehen, um eine Schleife über die Objekte (die Chancen stehen gut, es gibt zahlreiche Menge).
InformationsquelleAutor keyboardP
Während Sie Ihre Laufleistung variieren kann, ist meine Vorliebe zu verwenden
IDisposable
undDispose()
von Objekten, die ich nicht mehr brauche. Dies ist esp. true, wenn Sie mit nicht verwalteten Ressourcen, aber mit derDispose()
einrichten, erklärt Vorsatz.Finden Sie diese Ressource auf
GC.SuppressFinalize
für ein gutes Beispiel, wie die UmsetzungIDisposable
.http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
InformationsquelleAutor Gregory A Beamer
Set Referenz auf dieses Objekt zu
null
.InformationsquelleAutor piotrek
Nach der Einstellung von Objekt zu
null
, wenn Sie möchten, dass aus irgendeinem Grund, das Objekt sofort aufgefangen werden, rufen SieGC.Collect()
.Ein Beamer Von MSDN auf
GC.Collect
: "Erzwingt eine sofortige garbage collection für alle Generationen.". Natürlich hängt alles davon ab, eine situation, obGC.Collect
genannt werden sollte oder nicht. E. g. wenn ein Objekt verbraucht eine Menge Speicher, die freigegeben werden soll, so schnell wie möglichGC.Collect
nützlich ist.Lassen Sie mich ammend meine hastig angegebenen Anweisung. GC nicht guuranteed zu reinigen Objekte. Ich mag Rico Regeln für die Garbage-Collection: blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx
InformationsquelleAutor Centro
Welche Art von Objekt? Wenn eine Einweg - /IDisposable sollten Sie Anruf-Objekt.Dispose()
Andernfalls können Sie nur verwenden, object=null, und es wird 'gereinigt' automatisch. Das ist nicht C, in der Sie arbeiten 😉
Wenn Ihr 'Objekt' ist eigentlich eine komplexe Klasse, oder etwas mit mehr Gegenständen, die Sie berücksichtigen sollten, dass es eine Klasse IDisposable.
InformationsquelleAutor Vincent Koeman
Wenn das Objekt hält, nicht verwaltete Ressourcen implementieren
IDisposable
(und verwendenusing
oder rufen SieDispose()
auf Sie, wenn Sie fertig sind mit es).Wenn es nicht halten, nicht verwaltete Ressourcen, die dann der garbage collector wird behaupten, dass es "irgendwann", wenn keine weiteren Verweise darauf.
GC.Collect() wird vom garbage collector sammeln und es "zerstören" Sie Ihr Objekt, wenn es keine Verweise darauf. Dies ist nicht eine sehr gute Idee, denn es hat Auswirkungen auf die Leistung (es braucht Zeit und fördert andere Objekte in eine höhere generation, wodurch Sie länger im Speicher, bevor Sie zurückgefordert).
Warum müssen Sie das Objekt zerstört zu einem bestimmten Zeitpunkt fest?
InformationsquelleAutor Andrei
Was Sie wollen zu tun ist, rufen Sie
GC.SuppressFinalize()
, wenn Sie Umgang mit den cleanup-selbst... in der Regel verwenden SieGC.SuppressFinalize()
innerhalb einerIDisposable
Klasse. Siehe das code-Beispiel für die gemeinsame Nutzung vonIDisposable
:http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
Wenn Sie wirklich brauchen, um es von der Garbage Collection Eingesammelt sofort:
Aber ich warne Sie, sollten Sie wirklich lassen das Objekt den Gültigkeitsbereich verlässt, und lassen Sie die GC-sammeln Sie die Objekte, natürlich. Die .NET-runtime ist sehr effizient bei der Verwaltung von Speicher, solange Sie nicht versuchen, es zu tun job.
BEARBEITEN
Nach der überprüfung der Kommentare, ich sehe, Sie vergessen zu lassen, ein wichtiges Stück von Informationen, dass Sie die Bindung des Objektes an andere Objekte Methoden. Dies bedeutet, dass das Objekt, das Sie versuchen, zu finalisieren ist nicht abzuschließen, bis die Methode verwendet, um Uhr die Veranstaltung abgeschlossen wird, damit etwa eine Tonne zusätzliche Objekte im Speicher.
Was Sie tun können, diese zu brechen starke Referenz verwenden ein Objekt namens
WeakReference
. Oder Lambda-Ausdrücke, um zu brechen, die starke Referenzen.Sehen dies für ein Beispiel mit einer WeakReference
http://msdn.microsoft.com/en-us/library/system.weakreference.aspx
Oder können Sie etwas wie das hier tun:
statt
InformationsquelleAutor Nick Berardi