C#GDI+関連オブジェクトの自動解放問題

8248 ワード

winform開発では、カスタムコントロールがよく使われます.GDI+ペイントコントロールを使用するシーンに関連します.しかし、Brushのようなリソースでは、c#は自動的に解放されず、Disposeメソッドを呼び出してメモリを解放する必要があり、開発では忘れがちです.放出忘れによるメモリ漏洩を避けるために、これらのリソースを使用する方法を少しカプセル化すれば、GCを回収する際に、これらのリソースコードを自動的に解放することができます.
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を手動で呼び出すことなく、これらのメモリをどのように解放するかがわかります.