Las directrices de diseño de marco (2ª edición, página 327). Diga:Cómo implementar patrón de disponer con una estrecha método correctamente (CA1063)
considerar proporcionar método
Close()
, además de laDispose()
, si estrecha es estándar terminología en el área.Al hacerlo, es importante que haga la implementación Close idéntica a
Dispose
y considere implementar el métodoIDisposable.Dispose
explícitamente.
Así que, siguiendo el ejemplo proporcionado, tengo 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;
}
}
}
FxCop no parece que les gusta que:
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.Uso: Cambiar 'SomeClass.IDisposable.Dispose()' para llamar a 'GC.SuppressFinalize (object)'. Esto evitará la finalización innecesaria del objeto una vez que ha sido eliminado y ha quedado fuera del alcance.
CA1063: Microsoft.Design: modifica 'SomeClass.IDisposable.Dispose()' para que llame a Dispose (true), luego llama a GC.SuppressFinalize en la instancia de objeto actual ('this' o 'Me' en Visual Basic), y luego regresa.
CA1063: Microsoft.Design: cambie el nombre 'SomeClass.IDisposable.Dispose()' a 'Dispose' y asegúrese de que esté declarado como público y sellado.
- ¿Cómo se implementa el patrón de disponer con una estrecha método correctamente?
-o-
- ¿Cómo se suprimen las advertencias?
me trataron
[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 informes.
EDITAR: Si lo cambia todo como se sugiere elimina todos, pero esta advertencia:
CA1063: Microsoft.Design: Cambiar el nombre de 'SomeClass.IDisposable.Dispose()' a 'botar' y asegúrese de que es declarado como público y sellado.
EDIT 2: CODE_ANALYSIS fue hecho falta. Gracias.