.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对象永远不会被处理?
当垃圾回收器运行并确定对象不再使用时,它们将被处理。最好自己处理对象,这样资源就会立即释放。
还要考虑使用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方法调用的,所以这两个代码段不相同。