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?
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.
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 ...
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.
Tags und Links c# garbage-collection static