2010-10-08 11 views
8

Un colega mío afirma que en C# tener miembros estáticos en clases no estáticas impide que las instancias de esas clases sean basura recolectada y que esta es una fuente común de Fugas de memoria C#. Como resultado, siempre envuelve miembros estáticos en una clase estática y obtiene acceso a ellos desde allí a través de una propiedad estática o método (s) en esa clase estática. Siempre pensé que la estática estaba en la pila, no en el montón, por lo que no tenía nada que ver con la recolección de basura. No me parece correcto.Una pregunta sobre miembros estáticos dentro de clases no estáticas y recolección de basura

¿Cuál es la verdad acerca de esto?

Respuesta

11

Él no sabe de lo que está hablando. Los miembros estáticos dentro de una clase no estática hacen no evitan que las instancias de la clase sean basura recolectada.

Dicho esto, las estadísticas pueden estar en la pila o en el montón. No importa para la recolección de basura. Lo que sí importa es que las partes estáticas de un tipo no se almacenan con instancias del tipo.

0

Tu amigo es incorrecto.

La idea de un método estático es que NO hay ninguna instancia de esa clase. Entonces, nada existe para recolectar basura.

Intente poner this dentro de un método estático en una clase no estática y vea qué pasa.

5

Los miembros estáticos son las raíces del GC. Todo lo que se haga referencia desde una estática se mantendrá vivo. Si la referencia estática está en una clase estática o en una clase no estática es irrelevante.

Si tiene una clase no estática que tiene un campo estático y tiene instancias de esa clase, el campo estático no tiene muchas instancias, eso es parte de la definición de estática, no es un campo por instancia . Entonces, si la clase en sí misma es estática o no, no hace ninguna diferencia.

Así que sí, las referencias estáticas suelen ser una causa de pérdidas de memoria, especialmente eventos estáticos de los que no se ha anulado la suscripción cuando corresponde. Cambiar la clase para que sea estática no resolverá su pérdida de memoria: debe eliminar la referencia estática cuando finalice la duración de la instancia a la que hace referencia. A menudo, esto se hace mediante Dispose() ing el objeto y haciendo que el Dispose limpie la suscripción de referencia/evento.

This es un buen lugar para aprender más sobre cómo funciona el GC, cómo identifica la basura y qué hace al respecto. Además de Finalizadores y más ...

Cuestiones relacionadas