4

当实现using关键字来实例化一个IO.StreamWriter对象时,这是否意味着.close在对象上调用.dispose?或者它是否重要,因为一旦它使用它就超出了范围并且无论如何都会被垃圾收集?

4

2 回答 2

7

using 关键字将调用Dispose. 但是,按照惯例Dispose并且Close应该始终执行完全相同的功能,并且可以互换。

因此,任何既提供方法IDisposable又提供Close()方法的资源,例如Stream派生类,都可以在using块中使用。

框架设计指南中明确解决了这一点:“使Close实现与Dispose“......

IDisposable的MSDN 帮助还建议:“具有此类约定的类的实现者可能会选择实现具有自定义名称的公共方法,例如 Close,它调用 Dispose 方法。”

或者它是否重要,因为一旦它使用它就超出了范围并且无论如何都会被垃圾收集?

它不会被垃圾收集 - 在它不再在范围内并且不再被任何对象引用之后,它将有资格进行垃圾收集。这意味着它将(至少如果编写正确)最终会被清理,但它可能不会在很长一段时间内发生 - 包括直到程序终止。using 块导致资源(而不是内存),例如流,立即关闭。

于 2012-07-31T20:09:03.590 回答
2

UsingDispose仅在范围末尾调用。但是,对于诸如 , 之类的类StreamWriterDispose最终会在Close内部调用。

或者它是否重要,因为一旦它使用它就超出了范围并且无论如何都会被垃圾收集?

Using这是一个误解:块和方法的全部原因Dispose是对象没有在作用域结束时立即被垃圾收集。

于 2012-07-31T20:09:28.760 回答