是否会为匿名变量调用dispose?

时间:2009-04-29 17:17:50

标签: c# idisposable anonymous-class

例如,

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

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

4 个答案:

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