Eine Frage zu statischen Membern in nicht statischen Klassen und zur Garbage Collection

8

Ein Kollege von mir behauptet, dass in C # mit statischen Membern in nicht statischen Klassen verhindert wird, dass Instanzen dieser Klassen jemals Garbage Collected werden und dass dies eine häufige Quelle von C # Speicherlecks ist. Infolgedessen umschließt er statische Member immer in einer statischen Klasse und erhält von dort aus über eine statische Eigenschaft oder Methode auf diese statische Klasse Zugriff. Ich habe immer gedacht, dass Statik auf dem Stapel ist, nicht der Heap und damit nichts mit der Garbage Collection zu tun hat. Es scheint mir nicht richtig zu sein.

Was ist die Wahrheit darüber?

    
MrLane 08.10.2010, 03:37
quelle

3 Antworten

11

Er weiß nicht, wovon er redet. Statische Member in einer nicht statischen Klasse verhindern nicht , dass Instanzen der Klasse als Garbage Collected behandelt werden.

Das heißt, Statik kann auf dem Stapel oder Haufen sein. Es spielt keine Rolle für die Garbage Collection. Es kommt darauf an, dass die statischen Teile eines Typs nicht mit Instanzen des Typs gespeichert werden.

    
Joel Coehoorn 08.10.2010, 03:39
quelle
5

Statische Elemente sind Wurzeln für den GC. Alles, auf das von einem statischen Bezug genommen wird, wird am Leben erhalten. Ob die statische Referenz in einer statischen Klasse oder in einer nicht statischen Klasse ist, ist irrelevant.

Wenn Sie eine nicht statische Klasse mit einem statischen Feld haben und Instanzen dieser Klasse haben, hat das statische Feld nicht viele Instanzen - das ist Teil der Definition von static - es ist kein pro-Instanz-Feld. Ob die Klasse selbst statisch ist oder nicht, macht keinen Unterschied.

Also, statische Referenzen sind oft eine Ursache von Speicherlecks, insbesondere statische Ereignisse, von denen Sie sich nicht abgemeldet haben, wenn es angemessen ist. Durch das Ändern der Klasse als statisch wird das Speicherleck nicht gelöst. Sie müssen die statische Referenz entfernen, wenn die Lebensdauer der Instanz, auf die sie sich bezieht, abgeschlossen ist. Dies geschieht oft durch Dispose () des Objekts und durch das Dispose-Löschen des Referenz / Ereignis-Abonnements.

Dies ist ein guter Ort, um mehr darüber zu erfahren, wie der GC funktioniert, wie er identifiziert wird Müll und was es dagegen macht. Sowie Finalisten und mehr ...

    
Niall Connaughton 08.10.2010 20:05
quelle
0

Ihr Freund ist falsch.

Die Idee einer statischen Methode ist, dass es KEINE Instanz dieser Klasse gibt. Also existiert nichts zum Müll sammeln.

Versuchen Sie, this innerhalb einer statischen Methode in einer nicht statischen Klasse zu platzieren und sehen Sie, was passiert.

    
Alastair Pitts 08.10.2010 03:41
quelle

Tags und Links