.NET对象如何处理笔对象如果不这样做';不要对它们显式调用Dispose

本文关键字:对象 Dispose 调用 何处理 处理 这样做 如果不 NET | 更新日期: 2023-09-27 18:22:51

(为自己)编写一个类似油漆的小型应用程序时,我最初在onClick处理程序中调用了以下代码:

g.DrawEllipse((new Pen(pencolour, penSize)), e.X, e.Y, 1, 1);

后来我把它改成了

Pen pen1 = new Pen(pencolour, penSize);
g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
pen1.Dispose();

我的问题是:这两段代码是等效的,还是第一段代码创建的Pen对象永远不会被处理?

.NET对象如何处理笔对象如果不这样做';不要对它们显式调用Dispose

当垃圾回收器运行并确定对象不再使用时,它们将被处理。最好自己处理对象,这样资源就会立即释放。

还要考虑使用using语句:

using (Pen pen1 = new Pen(pencolour, penSize))
{
    g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
}

即使DrawEllipse会引发异常,这也会自动处理笔,并且IDE将强制pen1只能从using块中使用。

由于Pen实现了IDisposable,因此最好使用using语句来确保调用Dispose

using (Pen pen1 = new Pen(pencolour, penSize))
{
    g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
}

如果不这样做,pen1稍后将被GC ed,因为它在超出范围后不会被使用。

第一个创建的Pen对象永远不会被处理。它们最终会被GC清除,但它们会暂时泄漏Pen封装的任何非托管资源。

dispose肯定不是由DrawEllipse方法调用的,所以这两个代码段不相同。