在编写类似绘画的小应用程序(对我自己)时,我最初在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对象,而这些对象从未被丢弃?
答案 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,所以两个片段不一样。