2

例如,

int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);

没有 using 块,没有明显的方法来使用 using 块,没有明显的方法来调用 Dispose()。当然,UnmanagedResourceUsingMemorySuckingPig 确实实现了 IDisposable。

4

4 回答 4

9

如果该类的终结器调用Dispose(),是的。如果没有,不。

(编辑)只是一些附加信息

不要假设 Dispose 会被调用。如果未调用 Dispose,则还应在 Finalize 方法中释放类型拥有的非托管资源。

编辑

为了澄清上述编辑,我看到很多人(在这个线程、SO 和其他地方)声称“Dispose()当对象被删除时,GC 将调用”。根本不是这种情况。是的,编写组件的优秀的防御性编码人员会假设Dispose()不会显式调用该组件,并在终结器中这样做。但是,使用组件的优秀防御性编码器必须假定终结器不会调用Dispose(). 垃圾收集器中没有自动调用Dispose()。此功能仅在终结器调用Dispose().

于 2009-04-29T17:21:31.920 回答
3

我不相信。你必须写:

 using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig()) 
{
  myResult= urumsp.GetThingsDone(id);
}
于 2009-04-29T17:22:03.340 回答
1

您只能确定如果它有一个终结器(析构函数),那么它将被调用。终结器可能会调用Dispose(),但通常的实现是终结器和Dispose()调用protected Dispose(bool)

换句话说,它取决于 的实现UnmanagedResourceUsingMemorySuckingPig,如果它遵循指南,那么匿名对象将被清理,但不如使用using块那么有效。

于 2009-04-29T18:23:10.913 回答
0

不会。但是,GC 最终会收集对象并注意到它是可终结的(它是可终结的,对吗?)并会为您终结它。Dispose 用于确定性地清理资源。

于 2009-04-29T17:22:24.617 回答