Como implementar padrão de descarte com método close corretamente (CA1063)

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

  •  08-07-2019
  •  | 
  •  

Pergunta

O Guia de Design Framework (2ª Ed, página 327.) Dizer:

considerar o fornecimento método Close(), em adição ao Dispose(), se estreita é a terminologia padrão na área.

Ao fazer isso, é importante que você faça o Fechar implementação idêntico ao Dispose e considerar a implementação de método IDisposable.Dispose explicitamente.

Assim, seguindo o exemplo fornecido, eu tenho essa classe:

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 não parece assim:

CA1816: Microsoft.Usage: 'SomeClass.Close ()' 'GC.SuppressFinalize (objeto)' chamadas, um método que é normalmente chamado apenas dentro de uma implementação do 'IDisposable.Dispose'. Consulte o padrão IDisposable para mais informações.

CA1816: Microsoft.Usage: Change 'SomeClass.IDisposable.Dispose ()' para chamar 'GC.SuppressFinalize (objeto)'. Isto irá prevenir a finalização desnecessária do objeto, uma vez que foi descartado e ele caiu fora do escopo.

CA1063: Microsoft.Design: Modificar 'SomeClass.IDisposable.Dispose ()' para que ele chama Dispose (true), em seguida, chama GC.SuppressFinalize na instância atual do objeto ( 'isto' ou 'Me' no Visual Basic) e depois retorna.

CA1063: Microsoft.Design:. Rename 'SomeClass.IDisposable.Dispose ()' para 'Eliminar' e garantir que ele é declarado como público e selado

  • Como faço para implementar o padrão de descarte com método close corretamente?

-ou -

  • Como posso evitar os avisos?

Eu tentei

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
    this.Close();
}

mas FxCop 1,36 ainda relata-las.

Editar : Mudando-lo em torno de como elimina sugeridas todos, mas este aviso:

CA1063: Microsoft.Design:. Rename 'SomeClass.IDisposable.Dispose ()' para 'Eliminar' e garantir que ele é declarado como público e selado

EDIT 2 : CODE_ANALYSIS estava realmente faltando. Obrigado.

Foi útil?

Solução

Alterar-lo ao redor.

Tem Close () chamar this.Dispose () e colocar a lógica no método Dispose () em vez do método Close ().

------------------- Mais informações depois de editar ---------------

Além disso, alterar a declaração a:

public void Dispose()

deve se livrar do outro erro. Desde que você tê-lo declarado como:

void IDisposable.Dispose()

Não é marcado como público e selado, e FxCop reclama. Pessoalmente, eu prefiro ficar evitar os erros em vez de suprimi-los.

Outras dicas

Como posso evitar os avisos?

SuppressMessage () só funciona quando você especificar o sinalizador CODE_ANALYSIS como um símbolo de compilação condicional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top