DotNet下使用GDI+绘图时资源是否需要释放
可能很少有人注意到这样的问题,最近我在写一个绘图模块的时候,忽然意识到这好象是一个问题,因为不过我们以前用GDI绘图时,书本的代码会明确地告诉你一定要删除自已创建的绘图对象,因此我们常常写完了SelectObject,一定会马上写一个DeleteObject,以防止资源泄漏。
可是,当你来到的DotNet的环境下,你随便打开一本关于绘图的书,好了我们以经典的《C#高级编程(第3版)》为例,其中一个小段(P563):
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics dc = e.Graphics();
Pen bluePen = new Pen(Color.Blue,3);
dc.DrawRectangle(bluePen,0,0,50,50);
Pen redPen = new Pen(Color,Red,2);
dc.DrawEllipse(redPen,0,50,80,80);
}
我发现居然没有认为必需有的一句bluePen.Dispose(),为什么会是这样,会不会是作者的失误,如果是这样,作为一本经典的书籍作者是不应该出现这样的错误。而且整本书中也没有提到是否要释放这个资源的问题,如果不需要为什么CLR中又有Dispose这个方法呢?更加奇怪的是几乎能找到的C#代码中都没有Dispose这句。于是我决定用Reflector来看看CLR中的Dispose实现了什么。
以Pen类为例,Pen实现了三个有关资源释放的方法
public void Dispose();
private void Dispose(bool disposing);