例如,

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最终将收集该对象,并注意到它是可终结的(它可以最终确定,对吗?)并将为您完成它。处理是为了确定性地清理资源。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top