No estoy seguro de cómo se recolectan los objetos de clase definidos por el usuario. ¿Debo implementar una interfaz IDisposable en cada clase y llamar al método dispose() para liberar la memoria?¿Cada clase definida por el usuario necesita implementar una interfaz IDisposable para obtener basura recolectada?
Respuesta
No. Todos los objetos .NET administrados normalmente obtienen basura cuando deja de referirse a ella. IDisposable significa que implementará un método Dispose() que debe ser llamado por la persona que llama; por lo general, libera cosas que no se guardan en la basura. También ayuda a tener un lugar determinista para liberar memoria.
Salida del patrón IDisposable para asegurarse de que lo haces bien:
http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx
No, todos los objetos se eliminan automáticamente.
IDisposable se puede usar cuando tiene que realizar algún tipo de operación especial en la deconstrucción del objeto. Por ejemplo, si bloquea algunos recursos como archivos o cosas durante el trabajo de su objeto, puede liberarlos en su método Dispose.
IDisposable debe utilizarse cuando desee utilizar algún recurso nativo, como flujo de archivos en su código. Para todos los demás fines, el recolector de basura .Net hace un buen trabajo.
Simplemente implmentando el IDisposable no fuerza una recolección de basura. El método Dispose debe llamarse explícitamente para limpiar cualquier recurso nativo.
Editar: Le aconsejaré que vaya a través del capítulo Garbage Collection en ClR via C# por Jeff Richter.
No. Su clase definida por el usuario es una colección con guardapolvos cuando ya no se hace referencia en ninguna parte. Puede forzar esto simplemente haciendo classObject = null
. Si esa es la última parte de la aplicación que hace referencia actualmente al classObject
, la recolección de basura borrará su memoria.
IDisposable
se utiliza principalmente para que pueda organizar las actividades de recolección de basura a través de los métodos using()
.
No, no lo hace. El método Dispose()
está diseñado para hacer un trabajo extra. Elimine los recursos que deben eliminarse cuando el objeto ya no se utiliza. Recuerde, la basura recolectada puede pasar mucho tiempo después de que el objeto perdió su última referencia.
Cuando el IDisposable
se utiliza debe disponer el objeto cuando el hecho con fx using
como
using (SomeClassWithDisp object = new SomeClassWithDisp())
{
//Use the object
}
También, ver:
What is the difference between using IDisposable vs a destructor in C#?
En .NET, todos los objetos deben ser liberados desde la memoria con el recolector de basura por defecto, siempre que ya no se usen, por lo que no es necesario que implemente IDisposable en cada clase, pero es bueno tener algún tipo de memo mecanismo de liberación, como un destructor o el método Dispose.
Este es un buen ejemplo de un destructor que se utiliza: http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm
El método dispose() se implementa se utiliza para liberar explícitamente los recursos no administrados (archivos, arroyos, manijas, etc.) en que su objeto contiene una referencia.
La idea es liberar estos recursos tan pronto como sea posible, llamando al método de eliminación. El método dispose() no ejecutará INMEDIATAMENTE la recolección de basura en su objeto, sino que liberará los recursos y permitirá que el recolector de basura haga su trabajo cuando sea conveniente.
- 1. ¿Obtendrá esto basura recolectada?
- 2. Metodología de interfaces Java: ¿Debería cada clase implementar una interfaz?
- 3. ¿Debo implementar IDisposable para un Control de usuario?
- 4. JSTL - Usar forEach para iterar sobre una clase definida por el usuario
- 5. definida por el usuario operador de conversión de clase base
- 6. ¿Necesita implementar un finalizador en una clase que usa TcpClient?
- 7. Java Thread Basura recolectada o no
- 8. ¿Debo implementar IDisposable aquí?
- 9. ¿Por qué necesita una ruta definida para Html.Action?
- 10. ¿Cuándo debería implementar IDisposable?
- 11. MEF y el conjunto de interfaz por separado conduce a "Interfaz para cada clase"
- 12. Cómo implementar un conjunto con una igualdad definida por el usuario
- 13. Autofac y IDisposable interfaz
- 14. ¿La basura recolectada C será más rápida que C++?
- 15. ¿Puede una clase extender una clase e implementar una interfaz?
- 16. ¿Cómo hacer que gdb ejecute una función definida por el usuario (definida en .gdbinit) cada vez que se inicia?
- 17. ¿Por qué una interfaz no puede implementar otra interfaz?
- 18. Hacer una clase definida por el usuario de python ordenable, hashable
- 19. cómo eliminar un elemento de una lista de clase definida por el usuario?
- 20. ¿Necesita una clase abstracta así como una interfaz?
- 21. Creación de una interfaz de usuario configurable por el usuario en ios
- 22. cómo declarar una distribución definida por el usuario en R
- 23. Implementación IDisposable en una clase sellada
- 24. Valor predeterminado para la clase definida por el usuario en C#
- 25. Objeto no basura recolectada, pero no contiene gcroots
- 26. iphone: obtenga una variable definida por el usuario en la configuración de Target por código?
- 27. ¿Qué sucede cuando un Scala "Future" es basura recolectada?
- 28. ¿Qué hace que una clase definida por el usuario sea indestructible?
- 29. C++: Derivado + clase base ¿implementar una sola interfaz?
- 30. MySQL: crear una función definida por el usuario para una ordenación personalizada
Gracias por su respuesta. Entonces, si tengo una clase A y una de sus funciones públicas crea un objeto no administrado como mapa de bits y llama a BitMap.Dispose(), ¿será basura o la clase A guarda una referencia al mapa de bits? – kishore
Cuando llame a Dispose(), se eliminará en ese momento (el objeto no se puede usar). Si no lo hizo, el GC lo alcanzaría eventualmente, y si estaba escrito correctamente (lo era), entonces el Finalizar llamará a Dispose(). Pero se requiere llamar a Dispose() (use la instrucción using para hacerlo automáticamente). –
Además, definitivamente no debe implementar IDisposable a menos que lo necesite. Hace que el GC sea más lento para tener que lidiar con ellos (recordar llamar a Finalize, etc.). Si tiene una propiedad que es desechable o no administrada, vaya a implementarla. –