我需要调用Graphics.Dispose()吗?

时间:2009-10-15 14:38:12

标签: .net dispose

在VB.NET程序中,我正在创建一个新的位图图像,然后我调用Graphics.FromImage来获取一个Graphics对象来绘制位图。然后将图像显示给用户。

我见过的所有代码示例总是在Bitmaps和Graphics对象上调用.Dispose(),但是当没有触及磁盘上的文件时是否需要这样做?是否有任何其他非托管资源,这些对象可能已被抓取,垃圾收集器无法清除它们?

5 个答案:

答案 0 :(得分:6)

使用语句包装到您需要的范围内。然后不要担心显式调用Dispose()

伪代码:

using(new Graphics() = Graphics.FromImage)
{
     //Magic happens...
}

答案 1 :(得分:5)

始终在实现Dispose()的任何对象上调用IDisposable。图形对象使用的GDI句柄是不受管理的,需要在完成它们时进行处理。

最佳做法是封装using块。关于这个主题,有两个SO问题,BTW。

答案 2 :(得分:1)

是的,你应该调用Dispose。它与触摸磁盘无关;它与使用需要正确释放回操作系统的非托管资源有关。在Graphics对象的情况下,我假设它分配了设备上下文句柄,当不再需要它们时应该释放它们。

答案 3 :(得分:1)

Dispose()的规则是,如果您创建的对象是IDisposable,那么您应该调用它。最好的方法是using块或finally

可能你不需要这样做,但Dispose()会决定。

如果你有一个对象,但没有调用构造函数,那么你需要检查返回它的方法的文档,看它是否希望你调用Dispose()或者它会。

答案 4 :(得分:0)

Graphics implements IDisposable,因此您应该调用Dispose以确保清理非托管资源。

垃圾收集器不处理非托管资源,因此必须手动处理它们。这通常通过Dispose()方法完成,以便在明确定义的时间点提供清理。它也可以由终结器处理,但在这种情况下,资源的使用时间将超过必要时间。

确保在所有情况下调用Dispose的最简单方法是使用using构造。 E.g。

using(var g = Graphics.FromImage()) {
    // use the resource 
}