C#GDI+関連オブジェクトの自動解放問題
winform開発では、カスタムコントロールがよく使われます.GDI+ペイントコントロールを使用するシーンに関連します.しかし、Brushのようなリソースでは、c#は自動的に解放されず、Disposeメソッドを呼び出してメモリを解放する必要があり、開発では忘れがちです.放出忘れによるメモリ漏洩を避けるために、これらのリソースを使用する方法を少しカプセル化すれば、GCを回収する際に、これらのリソースコードを自動的に解放することができます.
使用する場合は、class a{
public GColor temp{get;set;}=new GColor(100,100,100);
}
a a=new a();
a.temp.Color=Color.Black;
色を設定すると、Brush、Penも色を変えます.
Brush b=new Gcolor(100100100)でもよい.SolidBrush;
Pen p=new GColor(100,100,100).Pen;
このように使用すると、自分でDisposeを手動で呼び出すことなく、これらのメモリをどのように解放するかがわかります.
public class GColor
{
private Color m_color;
public Color Color
{
get {
return m_color; }
set
{
if (m_color != value)
{
m_color = value;
}
}
}
private Pen m_pen;
public Pen Pen
{
get
{
if (m_pen != null && m_pen.Color != m_color)
{
m_pen.Dispose();
m_pen = new Pen(m_color);
}
return m_pen;
}
}
private SolidBrush m_brush;
public Brush SolidBrush
{
get
{
if (m_brush != null && m_brush.Color != m_color)
{
m_brush.Dispose();
m_brush = new SolidBrush(m_color);
}
return m_brush;
}
}
public GColor(int a, int r, int g, int b)
{
m_color = Color.FromArgb(a, r, g, b);
}
public GColor(int r, int g, int b)
{
m_color = Color.FromArgb(r, g, b);
}
public GColor(Color color)
{
m_color = color;
}
~GColor()
{
m_brush?.Dispose();
m_pen?.Dispose();
}
}
使用する場合は、class a{
public GColor temp{get;set;}=new GColor(100,100,100);
}
a a=new a();
a.temp.Color=Color.Black;
色を設定すると、Brush、Penも色を変えます.
Brush b=new Gcolor(100100100)でもよい.SolidBrush;
Pen p=new GColor(100,100,100).Pen;
このように使用すると、自分でDisposeを手動で呼び出すことなく、これらのメモリをどのように解放するかがわかります.