2010-02-06 7 views
6

... si uso un IDisposable en una variable local, pero no llamo a Dispose() o utilizar el patrón de uso de().¿Existe una regla FxCop para IDisposable usados ​​localmente?

public void BadMethod() 
{ 
    var fs = new FileStream("file.txt", FileMode.Create); 
    fs.WriteByte(0x55); 
    // no dispose, no using() 
} 

Al igual que la regla "Types that own disposable fields should be disposable" para los campos.


EDIT: Sustituido por MemoryStream FileStream, porque MemoryStream simplemente asigna memoria y no utiliza recursos (no administrados), por lo que alguien podría discutir acerca de una llamada obligatoria Dispose().

+1

¿Por qué quieres eso? No tiene sentido, la memoria no es desechable. Esperemos que no obtengamos una herramienta que dice que sí, destruirá las mentes del programador de forma irreparable. –

+8

@nobugz: Sigue siendo adecuado aquí para llamar a Dispose en MemoryStream. El hecho de que MemoryStream no use ningún recurso no administrado es un detalle * de implementación *. El ** contrato ** para MemoryStream dice que implementa IDisposable, y como tal, siempre debe tener Dispose invocado sobre él. Es * siempre * mejor codificar contra el contrato que contra los detalles de implementación específicos. – casperOne

+0

@capser: sí, algunos programadores les gusta la máquina para decirles qué hacer. Es una religión a la que no me suscribo, prefiero romper las reglas a sabiendas. Adelante y hazlo a tu manera, nunca se probará que estás equivocado. Simplemente inactivo. –

Respuesta

15

¿Hay una regla de FxCop para esto? Si y no.

En FxCop 1.35, que es en lo que se basa Visual Studio 2005 Code Analysis, había una regla DisposeObjectsBeforeLosingScope que hizo exactamente esto.

En FxCop 1,36 (Visual Studio Análisis de código 2008), sacaron su motor de análisis de flujo de datos, lo que significaba que esta regla también tuvo que ser retirado.

Sin embargo, en el siguiente FxCop (Visual Studio 2010 Code Analysis), parece que DisposeObjectsBeforeLosingScope ha vuelto.

+0

+1. No sabía que se agregó al 2010. Si bien no necesariamente estoy de acuerdo con la regla, esta es una respuesta directa a la pregunta. –

+0

Por cierto: En su segundo enlace: ¿Qué significa "Volviendo un objeto desechable requiere que el objeto se construye en un try/finally fuera de un bloque usando" significa ?? – ulrichb

+1

Ellos realmente cubren esto en la muestra en ese artículo. Mira el método 'OpenPort2'. Básicamente, si el objeto está construido pero no se inicializa, debe ser 'Dispose()' 'd antes de lanzar la excepción al usuario (de lo contrario, queda fuera del alcance). Un 'using' no sería apropiado aquí porque se espera que el * caller * llame a' Dispose() 'en un momento posterior. – bobbymcr

Cuestiones relacionadas