Disposable Pattern / FxCop

09/01/2009 - 14:18 von Stefan Hoffmann | Report spam
hi @all,

ich habe ein eigenes Control, welches ein Bitmap nutzt. Ohne den Aufruf
von _Bitmap.Dispose() liefert mir FxCop eine Meldung über die
fehlerhafte Implementierung von IDisposable und dem Disposable-Pattern.

public class BaseGraph : Control
{
protected Bitmap _Bitmap;

protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
if (!disposing && (_Bitmap != null))
_Bitmap.Dispose();
base.Dispose(disposing);
}
}

Gehört das _Bitmap.Dispose() nun in den Pfad mit disposing == true oder
disposing == false?

Beides wird von FxCop akzeptiert.


mfG
 

Lesen sie die antworten

#1 Günter Prossliner
09/01/2009 - 15:09 | Warnen spam
Hallo Stefan!

ich habe ein eigenes Control, welches ein Bitmap nutzt. Ohne den
Aufruf von _Bitmap.Dispose() liefert mir FxCop eine Meldung über die
fehlerhafte Implementierung von IDisposable und dem
Disposable-Pattern.



member.Dispose() muss dann von Deiner Dispose Methode aufgerufen werden,
wenn Du den member erstellt (mit new...) hast. Wenn Du diesen in irgendeiner
Form übergeben bekommen hast (z.b. ctor), solltest Du in der Regel KEIN
.Dispose() aufrufen, da Du dann etwas disposen würdest was nicht "dir
gehört". Wobei im .NET Framework selbst das teilweise (IMO leider) nicht
eingehalten wird (z.b. StreamReader.Dispose() wirkt sich auch auf den Stream
aus, wenn dieser mit new StreamReader(myStream) erstellt wurde).

public class BaseGraph : Control
{
protected Bitmap _Bitmap;

protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
if (!disposing && (_Bitmap != null))
_Bitmap.Dispose();
base.Dispose(disposing);
}
}

Gehört das _Bitmap.Dispose() nun in den Pfad mit disposing == true
oder disposing == false?



In den "true" Pfad. Dieser wird bei einem "nicht Finalizer" Dispose
aufgerufen. Sollte disposing false sein wird Dispose von Finalizer (bei der
Garbage Collection) aufgerufen. Da die Reihenfolge der Finalizer nicht
definiert ist, kann es sein, dass Dispose des Members bereits aufgerufen
wurde bevor Du die Gelegenheit dazu hast. Sollte Dein Dispose vorher sein,
wird das Dispose des Member nachher vom Finalizer aufgerufen.

Generell ist es so, dass im disposing == false Zweig nur unmanaged
Ressourcen freigegeben werden sollten.


OK?
mfg GP

Ähnliche fragen