Cómo implementar el patrón de disposición con el método de cierre correctamente (CA1063)
Pregunta
Las Directrices de diseño del marco (2ª ed., página 327) dicen:
CONSIDERE el método de suministro
Close ()
, además delDispose ()
, si close es la terminología estándar en el área.Al hacerlo, es importante que haga que la implementación Cerrar sea idéntica a
Dispose
y considere implementar el métodoIDisposable.Dispose
explícitamente.
Entonces, siguiendo el ejemplo proporcionado, obtuve esta clase:
public class SomeClass : IDisposable {
private SomeDisposable someInnerDisposable;
public void Open() {
this.someInnerDisposable = new SomeDisposable();
}
void IDisposable.Dispose() {
this.Close();
}
public void Close() {
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
this.someInnerDisposable.Dispose();
this.someInnerDisposable = null;
}
}
}
A FxCop no parece gustarle eso:
CA1816: Microsoft.Usage: 'SomeClass.Close ()' llama 'GC.SuppressFinalize (object)', un método que normalmente solo se llama dentro de una implementación de 'IDisposable.Dispose'. Consulte el patrón IDisposable para obtener más información.
CA1816: Microsoft.Usage: cambie 'SomeClass.IDisposable.Dispose ()' para llamar a 'GC.SuppressFinalize (objeto)'. Esto evitará la finalización innecesaria del objeto una vez que se haya eliminado y se haya salido de su alcance.
CA1063: Microsoft.Design: Modifique 'SomeClass.IDisposable.Dispose ()' para que llame a Dispose (true), luego llame a GC.SuppressFinalize en la instancia del objeto actual ('this' o 'Me' en Visual Basic) , y luego regresa.
CA1063: Microsoft.Design: cambie el nombre de 'SomeClass.IDisposable.Dispose ()' a 'Dispose' y asegúrese de que se declare como público y sellado.
- ¿Cómo implemento el patrón de disposición con el método de cierre correctamente?
-o-
- ¿Cómo elimino las advertencias?
Lo intenté
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
this.Close();
}
pero FxCop 1.36 todavía los informa.
EDITAR : cambiarlo según lo sugerido elimina todo excepto esta advertencia:
CA1063: Microsoft.Design: cambie el nombre de 'SomeClass.IDisposable.Dispose ()' a 'Dispose' y asegúrese de que se declare como público y sellado.
EDIT 2 : CODE_ANALYSIS realmente faltaba. Gracias.
Solución
Cámbielo.
Haga que Close () llame a esto. Dispose () y ponga la lógica en el método Dispose () en lugar del método Close ().
------------------- Más información después de editar ---------------
Además, cambiar la declaración a:
public void Dispose()
debería deshacerse del otro error. Como lo has declarado como:
void IDisposable.Dispose()
No está marcado como público y sellado, y FxCop se queja. Personalmente, prefiero evitar los errores en lugar de suprimirlos.
Otros consejos
¿Cómo elimino las advertencias?
SuppressMessage () solo funciona cuando especifica el indicador CODE_ANALYSIS como símbolo de compilación condicional.