Wie dispose Muster mit close-Methode implementieren richtig (CA1063)
Frage
Die Framework-Design-Richtlinien (. 2. Auflage, Seite 327) sagen:
PRÜFEN Verfahren
Close()
Bereitstellen, zusätzlich zu demDispose()
, wenn enge Standardterminologie in der Umgebung ist.Dabei ist es wichtig, dass Sie die Close-Implementierung identisch machen
Dispose
und berücksichtigen explizitIDisposable.Dispose
Verfahren.
So, nach dem vorgesehenen Beispiel, ich habe diese Klasse bekam:
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 scheint nicht, dass zu mögen:
CA1816: Microsoft.Usage: 'SomeClass.Close ()' Anrufe 'GC.SuppressFinalize (Objekt)', ein Verfahren, das typischerweise nur in einer Implementierung von 'IDisposable.Dispose' genannt wird. Beachten Sie die IDisposable Muster für weitere Informationen.
CA1816: Microsoft.Usage: Change 'SomeClass.IDisposable.Dispose ()' 'GC.SuppressFinalize (Objekt)' nennen. Dadurch wird eine unnötige Fertigstellung des Objekts verhindern, sobald er angeordnet wurde, und es hat den Gültigkeitsbereich gefallen.
CA1063: Microsoft.Design: Ändern 'SomeClass.IDisposable.Dispose ()', so dass es Dispose (true) aufruft, ruft dann GC.SuppressFinalize auf der aktuelle Objektinstanz ( 'this' oder 'Me' in Visual Basic) und kehrt dann zurück.
CA1063: Microsoft.Design. Umbenennen 'SomeClass.IDisposable.Dispose ()' zu 'entsorgen' und stellen Sie sicher, dass sie als öffentlich deklariert und versiegelt
- Wie implementiere ich das dispose Muster mit schließen Methode korrekt?
-oder -
- Wie unterdrücke ich die Warnungen?
Ich habe versucht,
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
this.Close();
}
aber FxCop 1,36 noch meldet sie.
Bearbeiten : Ändern sie sich um, als alle vorgeschlagenen beseitigt aber diese Warnung:
CA1063: Microsoft.Design. Umbenennen 'SomeClass.IDisposable.Dispose ()' zu 'entsorgen' und stellen Sie sicher, dass sie als öffentlich deklariert und versiegelt
EDIT 2 : CODE_ANALYSIS in der Tat fehlte. Danke.
Lösung
Ändern Sie es um.
Haben Sie Close () rufen this.Dispose () und setzen die Logik in der Methode Dispose () anstelle der Close () -Methode.
------------------- Weitere Informationen nach bearbeiten ---------------
Auch die Änderung der Erklärung an:
public void Dispose()
sollte den anderen Fehler loszuwerden. Da Sie es erklärt, wie haben:
void IDisposable.Dispose()
Es ist nicht als öffentlich markiert und versiegelt und FxCop beschwert. Ich persönlich ziehe bekommen die Fehler zu vermeiden, anstatt sie zu unterdrücken.
Andere Tipps
Wie unterdrücke ich die Warnungen?
SuppressMessage () funktioniert nur, wenn Sie die CODE_ANALYSIS Flagge als bedingte Kompilierung Symbol angeben.