2010-07-03 29 views
17

Estoy aprendiendo a dibujar cosas en C# y sigo viendo recomendaciones para usar dispose(), pero no entiendo muy bien lo que hace.¿Cuándo debo usar dispose() en los gráficos?

  • ¿Cuándo debería estar utilizando dispose() en un gráfico de código ?
  • ¿Qué ocurre si I no?
  • ¿Es necesario llamar cada vez que un gráfico no es visible, tales como en una interfaz gráfica de usuario que tiene pestañas y el usuario cambió a la otra pestaña, y luego volver a dibujar que cuando cambian de vuelta?
  • ¿Rompo cosas si las llamo cuando no debería?
  • ¿Batman escapará de las malvadas garras del Joker?

Respuesta

27
  • ¿Cuándo debería estar utilizando dispose() en un gráfico de código dibujado? Cuando haya terminado completamente con cualquier objeto que implemente IDisposable, debe llamar al Dispose justo antes de que sea elegible para la recolección de basura. Como han señalado otros, es mejor usar la declaración using en lugar de llamar al Dispose directamente.
  • ¿Qué sucede si no? Su programa será un poco menos eficiente porque tomará un poco más recursos de los necesarios. Este es el único inconveniente de no eliminar los gráficos ;, sin embargo, no deshacerse de otras clases en realidad puede causar errores (un ejemplo famoso es StreamWriter). Por esta razón, es mejor disponer siempre de cualquier clase que implemente IDisposable, como regla general.
  • ¿Necesito llamarlo cada vez que un gráfico no está visible, como en una GUI que tiene pestañas y el usuario cambió a la otra pestaña, y luego volver a dibujar cuando vuelven? No. Los objetos solo deben eliminarse cuando haya terminado de usarlos.
  • ¿Rompo cosas si las llamo cuando no debería? Sí. Si llama al Dispose antes de terminar con el objeto y luego intenta utilizar el objeto eliminado, obtendrá un ObjectDisposedException.
  • ¿Batman escapará de las malvadas garras del Joker? ¡Sintonícese mañana, el mismo tiempo de murciélago, el mismo canal de murciélagos!
+17

Esto necesita una regla más: no * descarte un objeto que no haya creado. La eliminación de e.Graphics es un error latente desagradable. –

+1

Sólo una nota para 'Gráficos' específicamente, si se ha eliminado llamando a sus métodos' Draw ... 'dará una' InvalidArgumentException' con el mensaje 'el parámetro no es válido' - no 'ObjectDisposedException'. –

0

Mitch Wheat says - Siempre llame a Dispose() en cualquier objeto que implemente IDisposable. Los identificadores GDI utilizados por los objetos gráficos no son administrados y requieren eliminación cuando haya terminado con ellos.

5

Cuando solicite un objeto gráfico, Windows asignará un poco de memoria para usted. Calling dispose ordenará esa memoria para usted. Si no llama a dispose, todos estos identificadores en la memoria permanecerán abiertos y eventualmente su sistema se quedará sin recursos, se volverá más lento y eventualmente se detendrá (sin embargo, cerrar el programa puede liberarlos).

Como está utilizando .NET, cuando haya terminado de usar su objeto de gráficos, el recolector de basura finalmente llamará a deshacerse de ellos. El problema con el recolector de basura es que nunca se sabe cuándo va a limpiar el objeto, por lo que puede dejar estos recursos abiertos durante más tiempo de lo necesario.

Dicho esto, nunca debe tener que llamar a deshacerse usted mismo. Mucho mejor será poner su objeto en el uso de alcance:

using(Graphics g) 
{ 
    // do something with the resource 
} 

Ahora cuando salga de este ámbito el uso, el objeto será destruido y botar se llamará automáticamente. Debe colocar todos los objetos que tienen el método de eliminación definido dentro de un alcance de uso.

3

En noob speak, Dispose() se trata de limpiar después de haber terminado de usar un recurso no administrado.

¿Qué es un recurso no administrado? Es todo lo que CLR no administra para usted. Son cosas como manejadores de archivos, conexiones de bases de datos, sockets de red, bolígrafos GDI +, etc. Obtienes acceso a esas cosas a través de un objeto .NET típico, pero implementará IDisposable, para permitirte limpiarlo correctamente.

¿Por qué limpiar? Hasta que haya limpiado después de usted, ese recurso no está disponible para otras partes del programa. En ese sentido, estás rompiendo cosas, porque estás acaparando un recurso.

¿Por qué hacer esto usted mismo? Debe hacer esto usted mismo tan pronto como deje de necesitar el recurso, en lugar de confiar en la magia automática del recolector de basura, ya que podría tomar un tiempo largo (bien, no especificado) antes de que el recolector de basura lo reciba. Hasta que un objeto no se haya eliminado correctamente, no puede reutilizar el recurso subyacente, por lo que su programa no funcionará de manera confiable.

Cuestiones relacionadas