Cómo implementar el patrón de disposición con el método de cierre correctamente (CA1063)

StackOverflow https://stackoverflow.com/questions/630955

  •  08-07-2019
  •  | 
  •  

Pregunta

Las Directrices de diseño del marco (2ª ed., página 327) dicen:

  

CONSIDERE el método de suministro Close () , además del Dispose () , 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étodo IDisposable.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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top