在VB.NET程序中,我正在创建一个新的位图图像,然后我调用Graphics.FromImage来获取一个Graphics对象来绘制位图。然后将图像显示给用户。
我见过的所有代码示例总是在Bitmaps和Graphics对象上调用.Dispose(),但是当没有触及磁盘上的文件时是否需要这样做?是否有任何其他非托管资源,这些对象可能已被抓取,垃圾收集器无法清除它们?
答案 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
}