例如,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
没有 using 块,没有明显的方法来使用 using 块,没有明显的方法来调用 Dispose()。当然,UnmanagedResourceUsingMemorySuckingPig 确实实现了 IDisposable。
例如,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
没有 using 块,没有明显的方法来使用 using 块,没有明显的方法来调用 Dispose()。当然,UnmanagedResourceUsingMemorySuckingPig 确实实现了 IDisposable。
如果该类的终结器调用Dispose()
,是的。如果没有,不。
(编辑)只是一些附加信息:
不要假设 Dispose 会被调用。如果未调用 Dispose,则还应在 Finalize 方法中释放类型拥有的非托管资源。
编辑
为了澄清上述编辑,我看到很多人(在这个线程、SO 和其他地方)声称“Dispose()
当对象被删除时,GC 将调用”。根本不是这种情况。是的,编写组件的优秀的防御性编码人员会假设Dispose()
不会显式调用该组件,并在终结器中这样做。但是,使用组件的优秀防御性编码器必须假定终结器不会调用Dispose()
. 垃圾收集器中没有自动调用Dispose()
。此功能仅在终结器调用Dispose()
.
我不相信。你必须写:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
您只能确定如果它有一个终结器(析构函数),那么它将被调用。终结器可能会调用Dispose()
,但通常的实现是终结器和Dispose()
调用protected Dispose(bool)
。
换句话说,它取决于 的实现UnmanagedResourceUsingMemorySuckingPig
,如果它遵循指南,那么匿名对象将被清理,但不如使用using
块那么有效。
不会。但是,GC 最终会收集对象并注意到它是可终结的(它是可终结的,对吗?)并会为您终结它。Dispose 用于确定性地清理资源。