Hay muchas preguntas SO preguntando cómo detectar fugas de objetos identificables. Parece que la respuesta es "you can't".Detectando objetos IDsposable "filtrados"
Acabo de comprobar con el caso de prueba más trivial, que FxCop 10.0 no lo hace, ReSharper 4 con MSVS2010 no lo hace.
Esto me parece incorrecto, peor que las pérdidas de memoria en C (para lo cual al menos hemos establecido herramientas para detectar).
Estaba pensando: ¿Es posible, utilizando la reflexión y otras técnicas avanzadas poco claras, que puedo inyectar un cheque en tiempo de ejecución, en el finalizador para ver si se ha llamado al Dispose
?
¿Qué hay de trucos de magia con WinDBG + SOS?
Incluso si no hay herramientas existentes para hacerlo, me gustaría saber si esto es teóricamente posible (mi C# no es muy nítida).
Ideas?
NOTA El título de esta pregunta podría haber sido engañoso. La verdadera pregunta aquí debería ser si un objeto IDisposable
ha sido Disposed()
correctamente. Quedarme eliminado por el GC no cuenta ya que lo considero un error.
Editar: Solución: .NET Memory Profiler hace el trabajo. Solo debemos enviar varios correos electrónicos no deseados al GC.Collect()
al final del programa para permitir que nuestro generador de perfiles pueda recoger las estadísticas correctamente.
La razón por la que existen herramientas para C++ pero quizás no para C# es que los recursos en C# son fundamentalmente diferentes ya que los recursos no administrados * ya no están acoplados a la duración del objeto *. Lo que se puede rastrear, tanto en C# como en C++, es la duración del objeto y si un objeto se ha eliminado correctamente. Pero los recursos desechables en C# no están de ninguna manera ligados a la duración del objeto, lo que hace que el seguimiento sea mucho más difícil. A modo de comparación, intente rastrear los recursos filtrados de GDI que no están vinculados a través de RAII para objetar el tiempo de vida en C++. No es tan fácil tampoco. –
He estado reflexionando sobre esto un poco. Desarrollé el hábito de verificar rápidamente los tipos mientras escribo código para ver si heredan de 'IDisposable'. Si lo hacen, los envuelvo en 'usar' en el alcance que necesitan para vivir. No hace nada por el código existente, pero pensé que lo mencionaría. –
Eche un vistazo a esta publicación donde puede usar el análisis de código de Visual Studio para detectar problemas de iDisposable en tiempo de compilación: http://stackoverflow.com/a/6213977/2862 –