如果没有显式调用Dispose,.NET对象如何处置?

时间:2012-02-07 18:56:03

标签: c# garbage-collection

在编写类似绘画的小应用程序(对我自己)时,我最初在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对象,而这些对象从未被丢弃?

4 个答案:

答案 0 :(得分:7)

它们在垃圾收集器运行时处理并确定该对象不再使用。最好自己处理对象,这样就可以立即释放资源。

还要考虑使用using声明:

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

这会自动处理Pen,即使DrawEllipse会引发异常,IDE也会强制pen1只能在using块中使用。

答案 1 :(得分:4)

Pen实施IDisposable时,最好使用using statement来确保调用Dispose

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

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

答案 2 :(得分:0)

第一个创建永不丢弃的Pen对象。他们最终将成为GC,但他们会暂时泄漏Pen所包含的任何非托管资源。

答案 3 :(得分:0)

DrawEllipse方法肯定不会调用dispose,所以两个片段不一样。