Come implementare correttamente il modello di smaltimento con il metodo close (CA1063)
Domanda
Le Linee guida per la progettazione del framework (2a edizione, pagina 327) dicono:
CONSIDERA fornire il metodo
Close ()
, oltre alDispose ()
, se close è la terminologia standard nell'area.Nel fare ciò, è importante rendere l'implementazione Chiudi identica a
Dispose
e prendere in considerazione l'implementazione esplicita del metodoIDisposable.Dispose
.
Quindi, seguendo l'esempio fornito, ho questa 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;
}
}
}
A FxCop non sembra piacere:
CA1816: Microsoft.Usage: 'SomeClass.Close ()' chiama 'GC.SuppressFinalize (oggetto)', un metodo che viene in genere chiamato solo all'interno di un'implementazione di 'IDisposable.Dispose'. Fare riferimento al modello IDisposable per ulteriori informazioni.
CA1816: Microsoft.Usage: modifica "SomeClass.IDisposable.Dispose ()" per chiamare "GC.SuppressFinalize (object)". Ciò impedirà la finalizzazione non necessaria dell'oggetto una volta che è stato eliminato e non rientra nell'ambito di applicazione.
CA1063: Microsoft.Design: modifica 'SomeClass.IDisposable.Dispose ()' in modo che chiami Dispose (true), quindi chiami GC.SuppressFinalize sull'istanza dell'oggetto corrente ('this' o 'Me' in Visual Basic) e quindi ritorna.
CA1063: Microsoft.Design: rinomina "SomeClass.IDisposable.Dispose ()" in "Dispose" e assicurati che sia dichiarato pubblico e sigillato.
- Come posso implementare correttamente il modello dispose con il metodo close?
-o -
- Come posso eliminare gli avvisi?
Ho provato
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
this.Close();
}
ma FxCop 1.36 li riporta comunque.
MODIFICA : cambiarlo come suggerito elimina tutto tranne questo avviso:
CA1063: Microsoft.Design: rinomina "SomeClass.IDisposable.Dispose ()" in "Dispose" e assicurati che sia dichiarato pubblico e sigillato.
MODIFICA 2 : CODE_ANALYSIS mancava davvero. Grazie.
Soluzione
Cambialo in giro.
Have Close () chiama this.Dispose () e inserisce la logica nel metodo Dispose () anziché nel metodo Close ().
------------------- Ulteriori informazioni dopo la modifica ---------------
Inoltre, cambiando la dichiarazione in:
public void Dispose()
dovrebbe sbarazzarsi dell'altro errore. Dal momento che lo hai dichiarato come:
void IDisposable.Dispose()
Non è contrassegnato come pubblico e sigillato e FxCop si lamenta. Personalmente, preferisco evitare gli errori invece di eliminarli.
Altri suggerimenti
Come posso eliminare gli avvisi?
SuppressMessage () funziona solo quando si specifica il flag CODE_ANALYSIS come simbolo di compilazione condizionale.