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

Pet*_*pie 4 c# garbage-collection

在编写一个类似绘画的小应用程序(对我来说)时,我最初在onClick处理程序中调用了以下代码:

g.DrawEllipse((new Pen(pencolour, penSize)), e.X, e.Y, 1, 1);
Run Code Online (Sandbox Code Playgroud)

我后来改为

Pen pen1 = new Pen(pencolour, penSize);
g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
pen1.Dispose();
Run Code Online (Sandbox Code Playgroud)

我的问题是:两个代码是等价的,还是第一个创建Pen对象,它们永远不会被丢弃?

C.E*_*uis 7

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

还要考虑使用该using声明:

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

这会自动处理Pen,即使DrawEllipse会抛出异常,IDE也会强制执行,pen1只能在using块中使用.

  • +1 Minor nitpick- GC不调用Dispose,它调用终结器(如果Pen正确实现,应该具有相同的效果,假设Dispose从未被用户代码调用). (4认同)