2009-10-15 18 views
6

En un programa VB.NET estoy creando una nueva imagen de mapa de bits, luego llamo Graphics.FromImage para obtener un objeto Graphics para dibujar en el mapa de bits. La imagen se muestra al usuario.¿Debo llamar a Graphics.Dispose()?

Todas las muestras de código que he visto siempre llaman .Dispose() en objetos de mapa de bits y gráficos, pero ¿hay alguna necesidad de hacer eso cuando ninguno de los archivos tocó en el disco? ¿Hay algún otro recurso no administrado que estos objetos puedan haber capturado y que no haya sido borrado por el recolector de basura?

Respuesta

5

Sí.

Llame siempre al 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.

La mejor práctica es envolver en un bloque using. Ha habido varias preguntas sobre este tema, por cierto.

+0

Disculpe si es un duplicado. No vi nada relacionado con este caso específico y tenía curiosidad por saber qué recursos (si los hubiera) no administrados se usarían en este caso. – alnorth29

1

Sí, debe llamar a Dispose. No está relacionado con tocar el disco; está relacionado con el uso de recursos no administrados que deben liberarse correctamente en el sistema operativo. En el caso del objeto Graphics, supondría que asigna identificadores de contexto de dispositivo que deberían liberarse cuando ya no se necesiten.

6

Envuélvala en utilizando la instrucción para el ámbito en el que la necesita. Entonces no preocuparse de llamar explícitamente a Dispose()

Pseudocódigo:

using(new Graphics() = Graphics.FromImage) 
{ 
    //Magic happens... 
} 
1

La regla con Dispose() es que si ha creado un objeto que es IDisposable, a continuación, se supone que para llamarlo. La mejor manera es dentro de un bloque using o finally.

Puede ser que no necesites hacerlo, pero Dispose() decidirá eso.

Si tiene un objeto, pero no llamó al constructor, entonces necesita verificar la documentación del método que lo devolvió para ver si espera llamar a Dispose() o lo hará.

+0

Para ser exactos, el uso adecuado de 'using' (ver otras respuestas) implícitamente hace 'Dispose', por lo que no necesita llamarlo usted mismo. – ToolmakerSteve

0

Graphics implements IDisposable, por lo que debe llamar a Eliminar para garantizar la limpieza de los recursos no administrados.

Los recursos no administrados no son manejados por el recolector de elementos no utilizados, por lo que deben manejarse de forma manual. Esto normalmente se realiza mediante el método Dispose() para proporcionar limpieza en un momento bien definido. También puede ser manejado por un finalizador, pero en ese caso el/los recurso (s) se usarán más de lo necesario.

La forma más fácil de asegurarse de que se llama a Dispose en todos los casos es emplear la construcción que usa. P.ej.

using(var g = Graphics.FromImage()) { 
    // use the resource 
} 
+0

"deben manejarse manualmente" no es estrictamente cierto, como escribió un poco más tarde. La correcta implementación de 'IDisposable' debe garantizar que esté seguro incluso sin disponer manualmente (en su código). –

+0

@MaciejDopieralski: Considero que todo lo que tenga que escribir código es un proceso manual.Si se olvida de llamar a Dispose, la limpieza no tendrá lugar. La recolección de objetos administrados por otro lado ocurre automáticamente. –

+0

Si está hablando de clases propias, sí, pero todas las clases 'IDisposable' de .NET Framework se eliminan tarde o temprano, incluso si no llama a' Dispose' en su código. –

Cuestiones relacionadas