Frage

Die Framework-Design-Richtlinien (. 2. Auflage, Seite 327) sagen:

  

PRÜFEN Verfahren Close() Bereitstellen, zusätzlich zu dem Dispose(), wenn enge Standardterminologie in der Umgebung ist.

     

Dabei ist es wichtig, dass Sie die Close-Implementierung identisch machen Dispose und berücksichtigen explizit IDisposable.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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top