.net 是否需要调用Graphics.Dispose()?

.net 是否需要调用Graphics.Dispose()?,.net,dispose,.net,Dispose,在VB.NET程序中,我正在创建一个新的位图图像,然后调用Graphics.FromImage以获取要在位图上绘制的图形对象。然后将图像显示给用户 我看到的所有代码示例都会在位图和图形对象上调用.Dispose(),但当它们都没有触及磁盘上的文件时,是否需要这样做?是否有其他非托管资源是这些对象可能捕获的,而垃圾收集器不会清除这些资源?是的,您应该调用Dispose。与触摸磁盘无关;它与使用需要正确释放回操作系统的非托管资源有关。对于Graphics对象,我假设它分配了不再需要时应该释放的设备上

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


我看到的所有代码示例都会在位图和图形对象上调用.Dispose(),但当它们都没有触及磁盘上的文件时,是否需要这样做?是否有其他非托管资源是这些对象可能捕获的,而垃圾收集器不会清除这些资源?

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

将其包装在using语句中,用于您需要它的范围。然后不必担心显式调用Dispose()

伪代码:

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

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

可能您不需要这样做,但Dispose()将决定这一点

如果您得到了一个对象,但没有调用构造函数,那么您需要检查文档中返回该对象的方法,看看它是否希望您调用Dispose()。

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

最佳做法是使用块包装在
中。顺便说一句,关于这个主题有几个SO问题,所以您应该调用Dispose以确保清理非托管资源

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

确保在所有情况下都调用Dispose的最简单方法是使用using构造。例如

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

对不起,如果这是重复的。我没有看到任何与此特定案例相关的内容,并且很好奇在本案例中会使用哪些(如果有的话)非托管资源。“它们必须手动处理”并不像您稍后所写的那样严格正确。正确地执行<代码> IDISPOLITION/code >应该确保即使没有手动(在代码中)处理也会安全。@ MaciejDopieralski:我会考虑任何你必须编写代码的手工过程。如果您忘记呼叫Dispose,则不会进行清理。另一方面,托管对象的收集是自动进行的。如果您谈论的是自己的类,那么是的,但是所有.NET framework
IDisposable
类都会被处理掉,即使您在代码中没有调用
Dispose
。@MaciejDopieralski:只要实现
IDisposable
,任何东西都不会被处理掉。您需要显式调用
Dispose
,或者通过
使用
构造调用。现在,如果类型还实现了一个终结器,可以为您调用
Dispose
,但这并没有改变开发人员必须处理的事实,这与GC.FWIW处理的托管内存自动清理不同,上面反复出现的混乱始于Brian没有区分处理非托管资源的类的设计者必须做什么——第二段“非托管资源…”,以及该类的客户端需要做什么——“确保调用Dispose”。确切地说,正确使用
使用
(请参阅其他答案)隐式地执行
处置
,因此您无需自己调用它。