ho qualche codice che attiverà CA1063 avvertimento analisi del codice:incendi analisi del codice CA1063 quando derivanti da IDisposable e forniscono implementazione in classe di base
CA1063: Microsoft.Design: Rimuovere IDisposable dall'elenco delle interfacce implementate da 'Funzionalità' e sostituisce invece l'implementazione Dispose della classe base.
Tuttavia, non sono sicuro di cosa devo fare per correggere questo avviso.
In breve, ho un'interfaccia IFunctionality
che deriva da IDisposable
. La classe Functionality
implementa IFunctionality
ma deriva dalla classe Reusable
per poter riutilizzare il codice som. La classe Reusable
deriva anche da IDisposable
.
public class Reusable : IDisposable {
~Reusable() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(Boolean disposing) {
// ...
}
public void DoSomething() {
// ...
}
}
public interface IFunctionality : IDisposable {
void DoSomething();
void DoSomethingElse();
}
public class Functionality : Reusable, IFunctionality {
public void DoSomethingElse() {
// ...
}
#if WORK_AROUND_CA1063
// Removes CA1063
protected override void Dispose(Boolean disposing) {
base.Dispose(disposing);
}
#endif
}
posso liberarmi di avvertimento sovrascrivendo Dispose
su Functionality
e chiamando la classe di base Dispose
anche se farlo non dovrebbe cambiare la semantica del codice.
Quindi c'è qualcosa di IDisposable
in questo contesto che ho trascurato o è solo CA1063 che si mischia per questo particolare costrutto?
So che posso sopprimere CA1063 ma la regola è abbastanza ampia e non voglio perdere nessun altro problema nell'implementazione di IDisposable
riportato da questa regola.
vecchia questione, ma i problemi con CA1063 sono molte volte superare contrassegnando la classe come 'sealed'. Se la classe non è 'sealed' penso che la classe deve' virual' o/e che il metodo 'Dispose()' deve essere 'protected' – mortb