例如,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
没有使用块,没有明显的方法来使用using块,没有明显的方法来调用Dispose()。当然,UnmanagedResourceUsingMemorySuckingPig确实实现了IDisposable。
答案 0 :(得分:9)
如果该类的终结者调用Dispose()
,是的。如果不是,不。
(编辑)只是一些additional info:
不要假设Dispose会 调用。 a拥有的非托管资源 类型也应该在一个 在事件中完成方法 不要调用Dispose。
修改强>
为了澄清上述编辑,我看到很多人(在这个帖子中,在SO和其他地方)声称“当删除对象时,GC将调用Dispose()
。”事实并非如此。是的,编写组件的好的防御性编码器将假定Dispose()
不会被明确调用,并且在终结器中这样做。但是,使用组件的好的防御性编码器必须假定终结器不会调用Dispose()
。 垃圾收集器中没有自动调用Dispose()
。如果终结器调用Dispose()
,则此功能仅适用于此。
答案 1 :(得分:3)
我不相信。你必须写:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
答案 2 :(得分:1)
你只能确定如果它有一个Finalizer(析构函数),那么它将被调用。
终结者可以致电Dispose()
,但通常的做法是终结者和Dispose()
致电protected Dispose(bool)
。
换句话说,它取决于UnmanagedResourceUsingMemorySuckingPig
的实现,如果它遵循指南,那么匿名对象将被清除,但不如using
块那样有效。
答案 3 :(得分:0)
没有。但是,GC最终将收集该对象,并注意到它是可终结的(它可以最终确定,对吗?)并将为您完成它。处理是为了确定性地清理资源。