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