2009-06-04 17 views

Respuesta

8

ponerlo en una instrucción using y ver si se compila:

using (var x = new TypeInQuestion(params)) {} 

Esto no se compilará si el TypeInQuestion no implementa IDisposable.

La otra manera más rápida es usar ReSharper, haga clic en la variable (x en este caso), y vea si tiene una sugerencia para ponerla en una declaración de uso.

+1

Motivo de baja votación, por favor? No puedo mejorar si no sé cuál fue el problema. –

1

Lamentablemente, no existe una forma "simple, simple y simple".

Vas a tener que presionar F12 en el nombre de la clase, y luego seguir presionando F12 en las clases base hasta que estés en la clase base, si alguno de ellos implementa IDisposable, ya lo tienes.

+0

Gracias --- eso es lo que hago actualmente, lo que provocó la pregunta, porque realmente debería haber una mejor manera. –

+0

+1 para el acceso directo No sabía acerca de – cjk

1

Si el tipo está relacionado con IO, ventanas/controles o gráficos, generalmente lo tomo como una pista de que debería estar buscando un método de eliminación.

Además, la presencia de un método 'Cerrar' puede implicar que el tipo es desechable, por ejemplo, si tiene una referencia a un XmlReader (que es IDisposable) no puede ver el método Dispose porque está implementado explícitamente.

6

Si tiene ReSharper, resalte la variable, espere la bombilla y luego presione Alt + Intro. Si una de las opciones es "Ajustar con 'usando'", es IDisposable.

+0

Al hacer la gestión de clases, realmente no es mucho mejor que ReSharper y tiene un punto de entrada de precio barato. – CAbbott

+0

CodeRush tiene esto también. El acceso directo es CTRL + 'en mi sistema. –

+0

Además, acabo de enterarme de que CodeRush marcará que este es un problema con el subrayado cursivo naranja. –

1

La forma más rápida para mí es generalmente escribir un bloque de uso (con fragmentos de código) para una instancia del tipo en cuyo caso recibirá una notificación de error si el tipo no implementa IDisposable. Eso generalmente toma solo un par de segundos. No muy conveniente, pero bastante rápido.

1

En los IDE más recientes, si tengo alguna pregunta de si algo implementa IDisposible, lo puse en un bloque de uso. El IDE le dirá si eso es incorrecto antes de que haya terminado con la siguiente línea de código.

0

tipificación de inicio y ver si IntelliSense recoge un método .Dispose

(según los comentarios, es rápido y (muy) sucio)

+1

No funcionará si el tipo implementa IDisposable explictly (necesitaría lanzar primero). – Richard

+0

No funcionará el 100% del tiempo, pero es un control rápido y sucio; también supone que el autor no agregó un método de eliminación sin implementar IDisposable. –

1

Usted puede hacer esto en PowerShell, por ejemplo,

[System.Management.Automation.Runspaces.pipeline].getinterface("IDisposable") 

vuelve

 
IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  False IDisposable 

mientras

[datetime].getinterface("IDisposable") 

vuelve nada.

+0

No es útil para tipos personalizados no cargados en Powershell. –

+0

Lo suficientemente fácil como para agregar tipos personalizados a PowerShell: '[Reflection.Assembly] :: Load (...)'. – Richard

1

Con el plug-in ReSharper instalado en Visual Studio, cuando usted tiene su cursor en una declaración de variables como el StringWriter en el siguiente fragmento:

TextWriter writer = new StringWriter(); 
writer.WriteLine("Test"); 

puede seleccionar "poner en 'utilizar' construir" de la menú 'bombilla', que a su vez, el fragmento anterior en:

using (TextWriter writer = new StringWriter()) { 
    writer.WriteLine("Test"); 
} 

Si la opción de "poner en ..." no está allí, el tipo no implementa IDisposable.

-1

No es rápido de hacer, pero también puede ejecutar FXCop, y lo alertará de objetos que son IDisposable que no están en un bloque using().

Trabajando en algún código heredado de C# aquí en el trabajo, encontré que quien lo escribió originalmente hizo un método ".Dispose()" en casi todas las clases, incluso si no es necesario, pero las clases no implementan IDisposable . Lo que significa que en inteligencia todos tienen un método Dispose(), pero no pueden colocarse usando() bloques ... ¡muy molestos!

Cuestiones relacionadas