implementar idisposable c#
¿Hay una lista de objetos comunes que implementan IDisposable para la instrucción using? (9)
Además de las otras respuestas, tenga en cuenta que una clase podría implementar IDisposable pero no tener a Dispose en la lista de intellisense.
class MyClass :IDisposable
{
void IDisposable.Dispose()
{
/* Stuff */
}
}
Me preguntaba si había algún tipo de hoja de trucos para la que los objetos van bien con la instrucción using ... SQLConnection
, MemoryStream
, etc.
Yendo un paso más allá, sería genial incluso mostrar las otras "piezas del rompecabezas", como la forma en que realmente debería llamar a la connection.Close()
Cierre connection.Close()
antes del cierre con el corchete de la declaración.
¿Algo así existe? Si no, tal vez deberíamos hacer uno.
Con ReSharper puedes mostrar todos los tipos derivados. Tal vez usted puede hacerlo con el navegador de objetos sin ReSharper, también. Vaya a la definición de la interfaz y busque "mostrar herederos".
El siguiente método de C # listará todos los tipos IDisposibles encontrados en un determinado ensamblaje. (Espacios de nombres utilizados: Sistema, System.Collections.Generic, System.IO, System.Reflection)
static void PrintDisposableTypesFromFile(String path)
{
Assembly assembly = Assembly.LoadFrom(path);
foreach (Type type in assembly.GetTypes())
if (type.GetInterface("IDisposable") != null)
Console.WriteLine(type.FullName);
}
El siguiente método de C # utiliza el anterior para hacer lo mismo para todos los ensamblajes en un directorio y sus subdirectorios, por ejemplo, "C: / WINDOWS / Microsoft.NET / Framework / v2.0.50727":
static void PrintDisposableTypesFromDirectory(DirectoryInfo dir, bool warn)
{
foreach (FileInfo file in dir.GetFiles("*.dll"))
{
try
{
PrintDisposableTypesFromFile(file.FullName);
}
catch (Exception ex)
{
if (warn)
{
Console.Error.WriteLine(
String.Format(
"WARNING: Skipped {0}: {1}",
new object[] { file.FullName, ex.Message }));
}
}
}
// recurse
foreach (DirectoryInfo subdir in dir.GetDirectories())
PrintDisposableTypesFromDirectory(subdir, warn);
}
No estoy seguro de que la lista de todos los elementos desechables sea muy útil, pero he usado un código similar para encontrar otras cosas interesantes, como la lista completa de codificaciones de texto admitidas por el marco .NET.
Microsoft FxCop tiene una regla que verifica que usas un IDisposbale en un bloque que usa.
Si está utilizando Visual Studio, puede presionar F12 en una declaración de tipo que lo llevará a una pantalla de metadatos o la definición de la clase (si tiene el código fuente). Si sus combinaciones de teclas son diferentes, haga clic con el botón derecho y "ir a definición". Desde allí puedes ver lo que implementa una clase. Sugiero hacer esto para todas las clases la primera vez que los encuentre para tener una idea de lo que la clase puede hacer.
Si no está seguro de si una clase implementa IDisposable
o no, IDisposable
en un bloque de using
independientemente. Si obtiene un error de compilación, simplemente elimínelo. Solo perderás unos segundos escribiendo tiempo.
Tal vez eche un vistazo a mi publicación sobre esto en http://www.lancemay.com/2010/01/idisposable-cheat-sheet/ . No estoy seguro de si eso es lo que estás buscando, pero según la pregunta original, parece que puede ser.
Una forma rápida y sucia de verificar si un tipo implementa IDisposable es crear una instancia de él y verificar si la instancia tiene una función miembro Dispose (). Si lo hace, entonces puede estar 99% seguro de que implementa IDisposable.
Una forma sencilla de obtener una lista de tipos que implementan IDisposable es abrir el Reflector, navegar a System.IDisposable
, expandir el nodo y luego expandir el nodo ''Tipos derivados''.
Para asegurarse de que su lista esté completa, verifique que todos los ensamblajes que está utilizando se hayan ''Abierto'' en Reflector.