2011-06-07 52 views

Respuesta

6

Establezca el objeto en null y Garbage Collector lo recogerá en su próxima ejecución.

Como nota al margen, si el objeto es algo que se crea a menudo (enemigos, viñetas, etc.), entonces puede utilizar un pool en lugar de eliminar el objeto. Esto significaría que el objeto se recicla y, por lo tanto, el recolector de basura se llama con menos frecuencia lo que aumentará el rendimiento.

+2

OMG, esto es lo último que se querer hacer en .NET –

+0

foreach (Kour dym en smokeList) { dym.ca s + = gameTime.ElapsedGameTime; if (dym.cas> TimeSpan.FromSeconds (0.5)) { dym = null; } } – Nasgharet

+0

its nots trabajando de esta manera ...... – Nasgharet

1

Establezca la referencia a este objeto en null.

0

Después de configurar el objeto a null, si desea por algún motivo que el objeto se recopile inmediatamente, llame al GC.Collect().

+0

No es un buen consejo genérico. Llamar a GC.Collect no garantiza que se acumule inmediatamente y de hecho puede terminar creando más problemas de los que vale. –

+0

@Gregory A Beamer de MSDN en 'GC.Collect': _" Fuerza una recolección de basura inmediata de todas las generaciones. "_. Por supuesto, todo depende de la situación de si se debe invocar 'GC.Collect' o no. P.ej. si un objeto consume mucha memoria que debe liberarse lo más rápido posible, 'GC.Collect' es útil. – Centro

+0

Permítanme enmendar mi declaración declarada apresuradamente. GC no está garantizado para limpiar cualquier objeto. Me gustan las reglas de Rico para la recolección de basura: http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx –

3

Si bien su millaje puede variar, mi preferencia es usar IDisposable y Dispose() de objetos que ya no necesito. Esto es especialmente verdadero cuando está utilizando recursos no administrados, pero tener la configuración Dispose() declara intención.

Consulte este recurso en GC.SuppressFinalize para obtener un buen ejemplo de cómo implementar IDisposable.

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx

+0

Además de usar Dispose, puedes seguir y seguir el patrón Desechable para que pueda liberar el objeto a voluntad, pero si se sale del alcance, el GC lo resuelve. –

0

¿Qué tipo de objeto? Si es un desechable/IDisposable debe llamar a object.Dispose() De lo contrario, puede usar object = null, y se 'limpiará' automáticamente. Esto no es C está trabajando en;)

Si su 'objeto' es en realidad un complejo de clase o algo con más objetos en él, es posible que desee considerar lo que es una clase IDisposable.

0

Si el objeto contiene recursos no administrados, implemente IDisposable (y use using o llame al Dispose() cuando haya terminado).

Si no contiene recursos no administrados, el recolector de basura lo reclamará "en algún momento" cuando ya no haya más referencias al mismo.

GC.Collect() hará que el recolector de basura recolecte y "destruirá" su objeto si no hay referencias al mismo. Esta no es una buena idea, ya que tiene implicaciones en el rendimiento (lleva tiempo y promueve otros objetos en una generación superior, lo que hace que duren más en la memoria antes de recuperarse).

¿Por qué necesita el objeto destruido en un determinado tiempo fijo?

0

Lo que quiere hacer es llamar al GC.SuppressFinalize() si está manejando la limpieza usted mismo ... Generalmente usa GC.SuppressFinalize() dentro de una clase IDisposable.Vea este ejemplo de código para el uso común de IDisposable:

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx

Si realmente necesita tener que el recolector de basura de inmediato:

var myObj = new MyObject(); 

// This object will be cleaned up by the Dispose method. 
// Therefore, you should call GC.SupressFinalize to 
// take this object off the finalization queue 
// and prevent finalization code for this object 
// from executing a second time. 
GC.SuppressFinalize(myObj); 

Pero le advierto que realmente debería dejar el objeto sale del alcance y deja que el GC recolecte los objetos de forma natural. El tiempo de ejecución .NET es muy eficiente en la gestión de la memoria siempre que no intente hacer su trabajo.

EDITAR

Después de revisar los comentarios, veo que se olvidó de dejar una pieza importante de información, en la que se hallaban vinculadas al objeto en cuestión con otros métodos de objetos. Esto significa que el objeto que está tratando de finalizar no finalizará hasta que el método utilizado para ver el evento haya finalizado, guardando así alrededor de una tonelada de objetos adicionales en la memoria.

Lo que puede hacer para romper esta referencia fuerte es usar un objeto llamado WeakReference. O usa lambdas para romper las referencias fuertes.

Ver esto para un ejemplo del uso de un WeakReference http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

O puede hacer algo como esto:

dym.cas += (x, y, z) => gameTime.ElapsedGameTime(x,y,z); 

en lugar de

dym.cas += gameTime.ElapsedGameTime;