Pregunta

¿Es necesario administrar manualmente la vida útil de los objetos de System.Drawing?

Actualmente estoy empleando declaraciones de 'uso' para minimizar la vida útil de los pinceles y otros objetos de dibujo, por ejemplo,

using ( Brush br = new SolidBrush( color ) )
{
    // Do something with br
}

¿Es esto necesario o es seguro dejar que el recolector de basura haga su magia cuando lo necesite?

Aparte de la pregunta ... ¿qué piensa la gente que es la forma más limpia de lograr esto?

¿Fue útil?

Solución

Es bueno deshacerse del objeto System.Drawing, sin embargo, si pierde una o dos cuando obtiene una excepción, no es el fin del mundo. (Los demás objetos como archivos abiertos y conexiones de base de datos siempre deben eliminarse)

Tener un montón de & # 8220; Usar & # 8221; La declaración en todo su código lo hace más complejo de entender. Por lo tanto, en el caso del objeto System.Drawing, considere simplemente llamando a Dispose () sobre ellos al final del método.

En el pasado, he usado una clase que escribí & # 8220; Dustcart & # 8221 ;, que implementa IDisposable, y contiene una colección de objetos para eliminar. A continuación, puede escribir código como:

using(var dustcart = new Dustcard())
{
   var p = dustcart.Add(new Pen(red, etc));
   var b = dustcart.Add(new Brush(black));

   Pen t;
   if (someFlag)
   {
      t = p;
   }
   else
   {
      t = dustcard.Add(new Pen(etc));
   }
}

Otros consejos

Cuando un objeto es IDisponible, es mejor desecharlo tan pronto como ya no lo necesite. (Implementa IDisposable por una razón).

Por supuesto, cuando olvida llamar a Dispose, el recolector de basura hará su trabajo en algún momento y lo limpiará, de modo que los recursos se liberen, pero nunca puede decir o adivinar cuándo se activará el recolector de basura. No es determinista.

Por lo tanto, mi consejo es: llame a Disose manualmente (como lo está haciendo ahora) tan pronto como ya no necesite el objeto desechable.

La regla general de oro es que si un objeto se implementa como IDisponible, debe limpiarlo. IDisposable no se implementa por capricho en el .NET Framework. Existen buenas razones para que esté allí.

Como dijeron los demás: cuando creas un objeto IDisponible, debes desecharlo lo antes posible. En su ejemplo específico, si el color se conoce en el momento de la compilación, puede usar un pincel estándar como Brush br = Brushes.Blue, que no necesita desechar.

Si está reutilizando el mismo color una y otra vez, podría almacenar el pincel como miembro de nivel de clase, sin embargo, esto significaría que la clase propietaria debería ser IDisponible también, y disponer el miembro de pincel en su método de desecho. Esto aumentaría el almacenamiento de memoria (por el tamaño de un pincel), pero podría reducir la cantidad de código (no usar declaraciones, sino una anulación adicional de Dispose).

Estoy usando la declaración de 'uso' tal como lo describió en su pregunta para garantizar que el Pincel, la Pluma, la Fuente, cualquier recurso se elimine correctamente. En mi código, encuentro que las declaraciones de uso están más limpias que tener llamadas explícitas .Dispose () dispersas por todas partes. Pero eso es solo mi preferencia.

Sin embargo, estoy de acuerdo con las respuestas anteriores: independientemente de si prefiere usar declaraciones o .Disponer llamadas, es bastante importante limpiar los recursos manualmente, en lugar de confiar en el recolector de basura. (Al principio confiaba en el recolector de basura y empezaron a surgir problemas de rendimiento, incluso antes de que las cosas en la aplicación se complicaran).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top