C# GDI+相关对象自动释放问题

在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(100,100,100).SolidBrush;

Pen p=new GColor(100,100,100).Pen;

这样使用,就系统就会怎么释放这些内存,而不用自己手动调用Dispose.

你可能感兴趣的:(winform,c#)