Laden...

Frage zu FxCop-Regel "ImplementIDisposableCorrectly"

Erstellt von yahoo vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.515 Views
Y
yahoo Themenstarter:in
220 Beiträge seit 2004
vor 18 Jahren
Frage zu FxCop-Regel "ImplementIDisposableCorrectly"

Hallo zusammen,

ich habe eine Frage zu der FxCop-Regel ImplementIDisposableCorrectly:

FxCop meldete zuerst ich soll Dispose in meine Klasse implementieren. Habe ich gemacht. Nun bekomme ich die Meldung ich soll Dispose "richtig" implementieren und
schlägt vor:

"Modify myFile.Dispose():Void so that it calls
Dispose(true), then calls GC.SuppressFinalize on the
current object instance ('this' or 'Me' in VB), and
then returns."

Ich habe das nun umgesetzt, die Meldung kommt aber trotzdem noch:


public void Dispose()
		{
			this.timer.Dispose();
			Dispose(); 
			GC.SuppressFinalize(this);
		}

Soweit ich weiß, soll man verhindern, den GC selbst "anzufassen". Stimmt das?
Und: Wie sollte hier mein Dispose aussehen? Passt der so?

Vielen Dank für eure Kommentare,

Yahoo

1.373 Beiträge seit 2004
vor 18 Jahren

Gemeint ist sowas:


class XYZ : IDisposable{

    ~XYZ() {
        Dispose( false );
    }


    public void Dispose() {
        Dispose( true );
        GC.SuppressFinalize( this );
    }


    protected void Dispose( bool disposing ) {
        if( disposing ) {
            // verwaltete resourcen befreien
        }
        // nicht verwaltete resourcen befreien
    }        
}

Grüße,
Andre

[edit]
Das SuppressFinalize macht nur Sinn, wenn die Klasse einen Finalizer (aka. Destruktor) hat.

Man unterscheidet mittels "disposing" ob aus einem Dispose() oder aus dem Finalizer() heraus aufgeräumt wird, da man aus dem Finalizer keine Verwalteten Objekte mehr "anfassen" sollte (die CLR garantiert nicht, dass zu diesem Zeitpunkt die Objekte hinter den Membervariablen noch existieren!). Nicht verwaltete Resourcen müssen natürlich in beiden Fällen aufgeräumt werden.

Y
yahoo Themenstarter:in
220 Beiträge seit 2004
vor 18 Jahren

Hallo VizOne,

Vielen Dank für dein BeispielCode!

Brache ich ein Finalizer/Destruktor?
Ich habe lediglich einen Timer (System.Timers.Timer) den ich Disposen will.
Auch habe ich keine unmanaged Komponenten, die
ich aufräumen müsste.

Dann müste doch folgender Code reichen, oder?


public void Dispose()
        {
            this.timer.Dispose();
        }

Yahoo

1.373 Beiträge seit 2004
vor 18 Jahren

Finalizer unbedingt nur dann, wenn man nicht verwaltete resourcen aufräumen muss. Die verwalteten Objekte kannst du eh nicht mehr verwenden im finalizer.

An sich ist dein Code technisch korrekt.

Grüße,
Andre

Y
yahoo Themenstarter:in
220 Beiträge seit 2004
vor 18 Jahren

Hallo,

Danke für deine Antwort, dann ignoriere ich die Regel bei FxCop.

Schönes WE,

Yahoo