Como implementar padrão de descarte com método close corretamente (CA1063)
Pergunta
O Guia de Design Framework (2ª Ed, página 327.) Dizer:
considerar o fornecimento método
Close()
, em adição aoDispose()
, 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étodoIDisposable.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.
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.