Estoy trabajando en un proyecto grande, y una de mis tareas es eliminar posibles fugas de memoria. En mi código, he notado que varios artículos descartables no se han eliminado, y lo he solucionado. Sin embargo, eso me lleva a una pregunta más básica, ¿cómo puedo encontrar todas las clases usadas en mi proyecto que implementen IDisposable? (No clases creadas a medida, sino clases de biblioteca estándar que se han utilizado).
Ya he encontrado una clase menos obvia que implementa IDisposable (DataTable implementa MarshalByValueComponent, que hereda IDisposable). En este momento, estoy verificando manualmente cualquier clase sospechosa mediante el uso de MSDN, pero ¿no hay alguna forma de automatizar este proceso?¿Cómo encontrar todas las clases que implementan IDisposable?
Respuesta
Reflector se puede mostrar qué clases implementan IDisposable
: Sólo localice la interfaz IDisposable
en el reflector, y se expanden los "tipos derivados" nodo
Otra opción, a partir del código, es escanear todos los ensamblados cargados para este tipo de aplicación de IDisposable
:
var disposableTypes =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IDisposable).IsAssignableFrom(t)
select t;
Esta pieza de código anterior escanea todos los ensamblajes cargados (en lugar de solo el ensamblaje que se está ejecutando) y da todos los tipos desechables ordenados por espacio de nombres, por lo que es muy fácil buscar cualquier tipo desechable que se haya perdido. Tx mucho :) – apoorv020
Creo que algo así como el siguiente código podría funcionar. Sin embargo, tendría que ajustarse para cargar el ensamblaje correcto si se ejecuta desde una herramienta externa.
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if(type.GetInterface(typeof(IDisposable).FullName) != null)
{
// Store the list somewhere
}
}
Esto no es exactamente lo que estaba buscando. Este código pasa por encima de los tipos definidos en el ensamblaje actual, mientras que deseo ejecutarlos sobre los tipos que son utilizados en el ensamblaje actual.
Puedo verificar fácilmente si una de las clases definidas en mis proyectos es IDisposable, sin embargo, quiero verificar si las clases de biblioteca estándar que estoy utilizando implementan IDisposable o no. –
apoorv020
@ apoorv020: Debería ser capaz de ejecutar el código anterior en los ensamblados .Net framework (cualquiera que sea referenciado por su proyecto) así como yo lo pensaría, y luego podría guardar una lista de todo lo que implemente 'IDisposable' y luego simplemente haga una búsqueda a través de su código fuente para cualquier cosa en esa lista? –
El código de "Thomas Levesque" hace exactamente eso. Gracias por su respuesta, sin embargo, me indicó la dirección correcta. – apoorv020
Intentar esta consulta LINQ:
var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
select t;
No creas que eso funcionaría, comenta MSDN: * El método IsSubclassOf no se puede usar para determinar si una interfaz se deriva de otra interfaz, o si una clase implementa una interfaz * –
gracias por la corrección. –
prueba su proyecto con FxCop. Puede atrapar todos los lugares donde no se eliminan los objetos identificables. Es posible que deba hacer algún trabajo para desactivar todas las reglas irrelevantes de FxCop, dejando solo reglas relacionadas con IDisposable.
Por ejemplo, esta es una de las reglas FxCop IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx
Nota: es necesario encontrar tanto en su propio, .NET y objetos de terceros IDisposable que no se manejan correctamente.
puede utilizar NDepend para analizar su proyecto y encontrar todos los tipos que implementan IDisposable.
tope aquí tienes la consulta CQL para el resultado
SELECT TYPES WHERE Implement "System.IDisposable"
- 1. ¿Cómo encontrar todas las clases que implementan una interfaz determinada?
- 2. Sesión que contiene elementos que implementan IDisposable
- 3. Eliminación de los miembros que implementan IDisposable
- 4. ¿Cómo puedo hacer un seguimiento de (enumerar) todas las clases que implementan una interfaz?
- 5. NUnit - Cómo probar todas las clases que implementan una interfaz particular
- 6. Eclipse: encuentre todas las clases que extienden la interfaz
- 7. Mantenga un registro de todas las clases que implementan una interfaz en particular?
- 8. ¿Enumerar todas las clases de Delphi que implementan una interfaz determinada?
- 9. Prueba de todas las clases que implementan una interfaz en Java
- 10. Encontrar todas las clases implementando una interfaz específica
- 11. ¿Cómo encontrar en Eclipse qué clases implementan múltiples interfaces?
- 12. Cómo inyectar dependencias en clases que implementan una interfaz?
- 13. JAXB: las clases generadas implementan la interfaz
- 14. Encontrar todas las clases con un atributo en particular
- 15. ¿Cómo se implementan las clases en los compiladores
- 16. ¿Debo implementar IDisposable en todas las clases, o es una clase base suficiente?
- 17. ¿Cómo puedo evitar escribir pruebas de unidades duplicadas para las clases que implementan la misma interfaz?
- 18. ¿Por qué no todas las clases System.Web.UI.WebControl con propiedades de texto implementan ITextControl?
- 19. Comprobación de Objetos que implementan IDisposable pero que no están desechados correctamente
- 20. ¿Cómo puedo encontrar qué clases implementan una interfaz determinada en Visual Studio?
- 21. ¿Cómo puedo hacer que todas las clases identificables ID coloreadas de forma diferente en el IDE de Visual Studio?
- 22. ¿Cómo encontrar todas las palabras que aparecen entre paréntesis?
- 23. ¿Por qué deberíamos colocar las interfaces con las clases que las usan en lugar de las que las implementan?
- 24. Resharper- Encuentra todas las clases no utilizadas
- 25. ¿Deben las interfaces vivir en el mismo espacio de nombres que las clases concretas que las implementan?
- 26. Encontrar todas las clases que heredan una interfaz en Visual Studio
- 27. ¿Cómo obtengo todas las instancias de todos los tipos cargados que implementan una interfaz determinada?
- 28. Inyectar diferentes clases que implementan la misma interfaz utilizando Ninject
- 29. Eclipse ¿Reemplazar texto en todas las clases?
- 30. Eliminar todas las clases que comienzan con una cierta cadena
puede decir que FxCop? – Arseny