Forums Neueste Beiträge
 

Muss man bei GDI+ immer dispose() verwenden oder macht das eh der GC?

17/10/2008 - 11:21 von Michael Böckinghoff | Report spam
Hallo NG,

bin zur zeit ein wenig in der GDI+ Welt unterwegs,
und da frag ich mich zur Zeit öfters ob zum schluss
ein dispose() vom brush oder pen zb wirklich nötig ist.

Oder kann man das ganze sein lassen sich die dispose Zeile sparen
und auf den GC vertrauen?

also im Beispiel unten:

pen.Dispose();
brush.Dispose();

könnt man sich die Zeilen sparen?

Gruß

Michael

Codeschnipsel:
###########
/// <summary>
/// Hilfsfunktion zum Zeichnen des Button im "UP" Status
/// </summary>
/// <param name="grfx"></param>
private void DrawButtonUp(Graphics grfx)
{
Pen pen = new Pen(Color.White);
SolidBrush brush = new SolidBrush(this.ForeColor);

// Links oben Ecke
pen.Color = Color.White;
grfx.DrawLine(pen, 0, 0, 0, this.ClientSize.Height - 1);
grfx.DrawLine(pen, 0, 0, this.ClientSize.Width - 1, 0);
// Rechts unten Ecke
pen.Color = Color.Black;
grfx.DrawLine(pen, 0, this.ClientSize.Height - 1,
this.ClientSize.Width, this.ClientSize.Height - 1);
grfx.DrawLine(pen, this.ClientSize.Width - 1,
this.ClientSize.Height, this.ClientSize.Width - 1, 0);
// Die graue ecke
pen.Color = Color.Silver;
grfx.DrawLine(pen, 1, this.ClientSize.Height - 2,
this.ClientSize.Width - 2, this.ClientSize.Height - 2);
grfx.DrawLine(pen, this.ClientSize.Width - 2,
this.ClientSize.Height - 2, this.ClientSize.Width - 2, 1);

pen.Dispose();
brush.Dispose();
}
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
17/10/2008 - 17:30 | Warnen spam
"Michael Böckinghoff" schrieb:
bin zur zeit ein wenig in der GDI+ Welt unterwegs,
und da frag ich mich zur Zeit öfters ob zum schluss
ein dispose() vom brush oder pen zb wirklich nötig ist.



Bei GDI+-Objekten, die im eigenen Code erstellt wurden, ist ein Aufruf von
'Dispose' (evtl. auch in 'finally') ratsam.

Oder kann man das ganze sein lassen sich die dispose Zeile sparen
und auf den GC vertrauen?



Nein, das kann man nicht, denn, wie der Name bereits sagt, bekommt die CLR
von unverwalteten Ressourcen und Ressourcenengpàssen nichts mit. Die CLR
wird zwar 'Dispose' aufrufen, aber da kann es bereits zu spàt sein, weil dem
System die unverwalteten GDI+-Ressourcen ausgegangen sind.

Pen pen = new Pen(Color.White);
SolidBrush brush = new SolidBrush(this.ForeColor);



In diesem Fall ist ein 'Dispose'-Aufruf sinnvoll.

Anstelle von 'new Pen(Color.White)' könntest Du aber auch 'Pens.White'
benutzen. Diesen Stift mußt/sollst/darfst Du dan nicht über 'Dispose'
freigeben.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen