? 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#
Respuesta
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.
Me sentí un poco sucio haciendo algo similar a esto.* se siente mejor ahora que tiene endoso de Skeet * –
Este no es un patrón "nuevo" de ninguna manera, no es que pueda recordar el nombre en este momento ... –
Puede usar FxCop para aplicar esta regla. Ver la Wikipedia para un quick overview.
No ayuda cuando las personas * usan * sus clases; no puede decirle a sus usuarios que utilicen FxCop – ChrisF
Buen punto. Pero este es su problema ...: D –
Haz que forme parte de la construcción y tengan que prestarle atención. –
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
- 1. C#: IEnumerator <T> en una instrucción using
- 2. usando varios tipos en una instrucción using (C#)
- 3. ¿Es posible hacer lo siguiente en una instrucción Switch - C++?
- 4. Uso de la instrucción using con WinForms ... ¿Buenas prácticas?
- 5. ¿Es posible aplicar panel.resize en el panel
- 6. instrucción using para el fondo trabajador
- 7. uso de 'using' en .NET
- 8. .NET - Sustitución anidada utilizando declaraciones con una sola instrucción using
- 9. ¿Cómo se traduce la instrucción "Using" de C# a VB?
- 10. ¿Cerrará una instrucción "using" alrededor de un DataReader?
- 11. Conmutar instrucción con expresión constante múltiple en C#. ¿Es posible?
- 12. ¿Cuál es la diferencia entre la instrucción using y la directiva en C#?
- 13. Uso de una instrucción Switch en Obj-C
- 14. ¿Puede un objeto declararse por encima de una instrucción using en lugar de en los soportes
- 15. ¿Cuándo se debe usar la instrucción Using?
- 16. El uso de una cláusula HAVING en una instrucción UPDATE
- 17. Uso de la declaración "using" para eliminar
- 18. Powershell v1: ¿Es posible asignar el resultado de una instrucción switch a una variable?
- 19. ¿Es posible aplicar el comportamiento de solo lectura con SqlCommand?
- 20. ¿Posible canalizar en una instrucción if?
- 21. uso de la palabra clave "using" en C#
- 22. ¿Cómo se prueba un método con una instrucción `using`?
- 23. ¿Es posible forzar el uso de "usar" para clases desechables?
- 24. ¿Hay algún efecto secundario de regresar desde el interior de una instrucción using()?
- 25. ¿Cuál es el equivalente del bloque C# "using" en IronPython?
- 26. ¿Puedo aplicar una cláusula WHERE en el objetivo en una instrucción MERGE?
- 27. ¿La instrucción goto es lenta en C#?
- 28. La sentencia C# using, SQL y SqlConnection
- 29. C# error de captura using
- 30. ¿Es posible usar mysqli_fetch_object con una instrucción preparada?
¿Qué pasa con la incorporación de su objeto en un objeto desechable diferente? –
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. –
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. –