2009-04-15 14 views
6

? Realmente me gustaría poder decorar mi clase con un atributo de algún tipo que imponga el uso de una instrucción using para que la clase siempre se elimine de forma segura y evita fugas de memoria. Alguien sabe de tal técnica?¿Es posible aplicar el uso de una instrucción using en C#

+0

¿Qué pasa con la incorporación de su objeto en un objeto desechable diferente? –

+0

La decoración de su clase con IDisposable está destinada a ser la bandera para los consumidores de su clase que deben incluir un uso, o llamar a Dispose. Si aplica la técnica de "Uso", efectivamente está diciendo a sus buenos consumidores "Creo que es demasiado grueso para llamar a Dispose" y limitando el uso. –

+0

También quería decir, ¿está seguro de que no hay escenarios en los que alguien pueda querer crear su objeto en un método y deshacerse de él en otro? (Quizás también puedan ser identificables). Estás imposibilitando que alguien haga esto. –

Respuesta

13

Bueno, hay una manera en que podría hacerlo, solo permita el acceso a su objeto a través de un método estático que requiere un delegado. Como un ejemplo muy simplificado (como, obviamente, hay muchas maneras diferentes de abrir un archivo - leer/escribir, etc.):

public static void WorkWithFile(string filename, Action<FileStream> action) 
{ 
    using (FileStream stream = File.OpenRead(filename)) 
    { 
     action(stream); 
    } 
} 

Si las únicas cosas capaces de crear una instancia de su objeto desechable son los métodos dentro de su propio clase, puedes asegurarte de que se usen apropiadamente. Es cierto que no hay nada que impida que el delegado tome una copia de la referencia y trate de usarla más tarde, pero ese no es el mismo problema.

Esta técnica limita severamente lo que puede hacer con su objeto, por supuesto, pero en algunos casos puede ser útil.

+2

Me sentí un poco sucio haciendo algo similar a esto.* se siente mejor ahora que tiene endoso de Skeet * –

+0

Este no es un patrón "nuevo" de ninguna manera, no es que pueda recordar el nombre en este momento ... –

5

Puede usar FxCop para aplicar esta regla. Ver la Wikipedia para un quick overview.

+0

No ayuda cuando las personas * usan * sus clases; no puede decirle a sus usuarios que utilicen FxCop – ChrisF

+0

Buen punto. Pero este es su problema ...: D –

+0

Haz que forme parte de la construcción y tengan que prestarle atención. –

0

Si desea asegurarse de que su objeto siempre se elimine, utilice un finalizador en combinación con IDisposable.

Pero antes de hacerlo, leer sobre IDisposable y finalizadores, y ser consciente del hecho de que normalmente no los necesita a menos que su clase está haciendo algo así como la gestión de la vida útil de un recurso no administrado.

Con un finalizador su objeto será reclamado 'eventualmente' ya sea que esté envuelto en un uso o no. La instrucción de uso, que es una conveniencia para IDisposable, permite que tenga lugar una limpieza determinista. La única advertencia es que los objetos con finalizadores son más caros de limpiar y, en general, se quedan más tiempo en la memoria mientras esperan su finalización.

ref When do I need to implement a finalizer or IDisposable? o technorabble: Using Dispose, Finalizers and IDisposable

Cuestiones relacionadas