使用关键字:.Close或.Dispose

时间:2012-07-31 20:05:43

标签: vb.net garbage-collection

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

2 个答案:

答案 0 :(得分:7)

using关键字将调用Dispose。但是,通过约定DisposeClose应始终执行完全相同的功能,并且可以互换。

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

明确地在Framework Design Guidelines中解决了这个问题:“让Close实现与Dispose相同非常重要”...

MSDN help for IDisposable也表明:“具有这种约定的类的实现者可能会选择使用自定义名称实现一个公共方法,例如Close,它调用Dispose方法。”

  

或者它是否重要,因为一旦它到达终点使用它超出范围并且将被垃圾收集反正?

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

答案 1 :(得分:2)

Using仅在范围的末尾调用Dispose。但是,对于StreamWriter等类,Dispose最终会在内部调用Close

  

或者它是否重要,因为一旦它到达终点使用它超出范围并且将被垃圾收集反正?

这是一个误解:Using块和Dispose方法的全部原因是对象在范围结束时立即收集而不是垃圾。