2009-03-10 4 views
12

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 la Dispose(), 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étodo IDisposable.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.

Respuesta

15

Cambie todo.

Have Close() llama esto.Dispose() y coloca la lógica en el método Dispose() en lugar del método Close().

------------------- Más información después de editar ---------------

Además, el cambio de la declaración a:

public void Dispose() 

debería deshacerse del otro error. Puesto que usted tiene que declararse como:

void IDisposable.Dispose() 

No es marcada como pública y sellado, y FxCop se queja. Personalmente, prefiero evitar los errores en lugar de suprimirlos.

1

¿Cómo elimino las advertencias?

SuppressMessage() solo funciona cuando se especifica el indicador CODE_ANALYSIS como un símbolo de compilación condicional.

Cuestiones relacionadas