2010-03-02 15 views
9

Muchas clases de GDI + implementan IDisposable, pero no estoy seguro de cuándo llamar a Dispose. Está claro para las instancias que creo con new o métodos estáticos como Graphics.CreateGraphics. Pero, ¿qué ocurre con los objetos que devuelven los compradores de propiedades? A menudo escribo código como este:¿Cuándo dispone de los recursos de GDI +?

var oldRgn = g.Clip; 
using (var rectRegion = new Region(rectangle)) 
{ 
    g.Clip = rectRegion; 
    // draw something 
} 
g.Clip = oldRgn; 

se supone que voy a disponer oldRgn después de eso? Mi perfil de memoria me dice que hay instancias no expuestas si no lo hago. Y mirando a la puesta en práctica en el reflector al menos confirma que el captador aparentemente crea una nueva instancia cada vez que se invoca:

// Graphics.Clip code from Reflector: 
public Region get_Clip() 
{ 
    Region wrapper = new Region(); 
    int status = SafeNativeMethods.Gdip.GdipGetClip(new HandleRef(this, this.NativeGraphics), new HandleRef(wrapper, wrapper.nativeRegion)); 
    if (status != 0) 
    { 
     throw SafeNativeMethods.Gdip.StatusException(status); 
    } 
    return wrapper; 
} 

no pude encontrar nada acerca de que en el MSDN, y las muestras en la documentación nunca parecen para deshacerse de cualquier cosa

+0

Intenta mover "g.Clip = oldRgn" en el bloque de uso. –

Respuesta

2

En general, si la clase es IDisposable, debe llamar al método .Dispose cuando el objeto no es necesario.

Además, la biblioteca de MSDN dice:

Modificar el objeto Región volvió por la propiedad clip no afecta dibujo subsiguiente con los gráficos objeto. Para cambiar la región del clip, reemplace el valor de la propiedad del Clip con un nuevo objeto Región .

Lo que significa que DEBE disponer de oldRgn.

+0

He leído el párrafo de MSDN cuatro veces, pero sigo sin ver la conexión. Lo mismo podría decirse sobre 'Brushes.Red'; El getter devuelve un objeto desechable; modificar el objeto no afecta el dibujo posterior. ¿Pero eso significa que tengo que deshacerme de 'Brushes.Red' cada vez que invoco el getter? – Niki

+2

Dado que 'Brushes.Red' es una propiedad estática, es probable que no necesite deshacerse del objeto. De lo contrario, ¿por qué la propiedad sería estática? Se realiza para guardar un objeto al que se accede con frecuencia para el acceso global y la reutilización de recursos. Esa es la diferencia entre esto y su pregunta inicial. Sin embargo, siempre tiene sentido usar Reflector en caso de cualquier incertidumbre. – Kerido

+0

Entonces, esencialmente, no hay ninguna regla: siempre debe buscar en la fuente para saber si debe deshacerse del resultado de un getter de propiedad. Y apuesta en el GC en casos poco claros. Me temo que sí, pero gracias por tu respuesta de todos modos. – Niki

Cuestiones relacionadas