2009-06-23 9 views
16

Me preguntaba si había algún tipo de hoja de trucos para que los objetos van bien con la instrucción using ... SQLConnection, MemoryStream, etc.¿Hay una lista de objetos comunes que implemente IDisposable para la instrucción using?

Tomando un paso más allá, sería muy bueno para mostrar incluso al otro "piezas del rompecabezas", por ejemplo, cómo se debe llamar al connection.Close() antes del cierre usando el corchete de la declaración.

¿Algo así existe? Si no, tal vez deberíamos hacer uno.

+0

¿Por qué tendrías que llamar a la conexión?Cerrar() antes del corchete final No sé si hay muchas otras piezas en el rompecabezas. –

+0

¿Por qué una lista? Puede verificar fácilmente si un objeto implementa IDisposable. – Groo

+0

@Groo: Realmente tiene que verificar los documentos, algunos tipos ocultan el Dispose(). Entonces no es tan fácil. –

Respuesta

10

Microsoft FxCop tiene una regla que comprueba que utiliza un IDisposbale en un bloque de uso.

1

Con ReSharper puede mostrar todos los tipos derivados. Quizás también puedas hacerlo con el navegador de objetos sin ReSharper. Vaya a la definición de la interfaz y busque "mostrar herederos".

+0

Ni sabiendo ReSharper, ¿verdad? trabajar para interfaces? ¿Está en todo el proyecto o podría incluir el GAC y otras carpetas? –

+0

Funciona para todo y puede incluir conjuntos de bibliotecas, incluidos los del GAC. También puede hacer clic en una asignación, y sugerirá un bloque de uso si el tipo que se asigna implementa IDisposable. –

4

Si no está seguro de si una clase implementa IDisposable o no, encerrarlo en un bloque using independientemente. Si obtiene un error de compilación, simplemente elimínelo. Solo perderás unos segundos escribiendo el tiempo.

+0

Es cierto, esto funciona como un encanto. –

+1

En la mayoría de los casos, si hay un método de eliminación implementará IDisposable. – weiqure

+0

@weiqure - pero no al revés –

2

Una manera simple de obtener una lista de los tipos que implementan IDisposable es abrir Reflector, navegar hasta 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 hayan sido 'abiertos' en Reflector.

7

El siguiente método C# mostrará una lista de todos los tipos identificables que se encuentran en un determinado ensamblaje. (Espacios de nombres utilizadas: 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 C# hace uso de la anterior para hacer lo mismo para todos los conjuntos en un directorio y sus subdirectorios , p.ej "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 la lista de todos los desechables es muy útil, pero yo he utilizado un código similar para encontrar otras cosas interesantes como la lista completa de codificaciones de texto compatibles con .NET framework.

+0

+1 por esfuerzo, pero creo que sería más fácil usar simplemente el reflector :) –

0

& manera rápida de comprobar si un tipo implementa IDisposable es crear una instancia de este y comprobar si la instancia tiene una función de miembro Dispose(). Si lo hace, entonces puede estar 99% seguro de que implementa IDisposable.

3

Además de las otras respuestas, tenga en cuenta que una clase podría implementar IDisposable pero no tener Dispose en la lista intellisense.

class MyClass :IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
     /* Stuff */ 
    } 
} 
2

Si está utilizando Visual Studio puede pulsar F12 en una declaración de tipo que le llevará a una pantalla de meta-datos o la definición de clase (si tiene el código fuente). Si las combinaciones de teclas son diferentes, haga clic derecho y "vaya a la definición". Desde allí puedes ver lo que implementa una clase. Sugiero hacer esto para todas las clases la primera vez que los encuentres para tener una idea de lo que la clase puede hacer.

+2

Sí, pero no todas las clases que implementen IDisposable lo implementan directamente. Tome DataTable por ejemplo (que, por cierto, no necesita deshacerse ... pero esa es otra conversación http://stackoverflow.com/questions/913228/should-i-dispose-dataset-and-datatable). – Grinn

14

Quizás mi comentario en este artículo en http://www.lancemay.com/2010/01/idisposable-cheat-sheet/. No estoy seguro de si eso es lo que está buscando, pero según la pregunta original, parece que sí.

+2

Cool ! ¡Esto es exactamente lo que estaba buscando originalmente! –

+0

wow tantos comentarios, mientras que esta es la respuesta! gracias Lance! – aron

Cuestiones relacionadas