vb.net中具有相同变量的多个“= new”。垃圾收集是否处理以及如何处理?

时间:2009-07-30 19:28:05

标签: .net vb.net garbage-collection

Dim x as whatever

Try 

    x = new whatever(1)

    something is done with x

    x = new whatever(2)

    something is done with x

Catch 

Finally 

    x.dispose

End Try

x = what(1)

会发生什么

垃圾收集是否找到指向第一个new的指针并将其销​​毁或者是什么?

2 个答案:

答案 0 :(得分:9)

垃圾收集最终会找到旧对象,最终确定。这与处理不完全相同,并且它要求对象在生成终结器线程时生成额外的GC生成。 (见下面的长篇故事)

你应该使用不同的变量名(无论如何都是好的做法)并处理它们,或者在用第二个变量覆盖变量之前处理第一个。

这样做的最好方法是使用using statement来确保对象完全被丢弃,这样就根本不需要try / catch。

Using x as new whatever(1)
    something is done with x
End using

Using y as new whatever(2)
    something is done with y
End using

[编辑:长篇故事。你取消引用第一个x。然后在GC运行的某个时刻,它会检测到第一个X没有任何根。如果对象有一个终结器,那么它会在终结器线程上放置一个对象的引用 - 请注意,仅仅因为一个对象是一次性的并不一定意味着对象本身有一个终结器,但是对象或子对象中的某些东西几乎肯定会有一个。这意味着对象 - 或子对象 - 在GC运行中幸存,因此被提升为第1代。然后终结器运行并最终确定终结器线程上释放其非托管内存的所有对象。然后你必须等待GC再次运行,但是这次你必须等待第1代收集,这是非常罕见的,但是当它最终确实发生时,你的对象最终会被收集]

答案 1 :(得分:0)

关于如何/何时/如果需要调用Kim Hamilton sums up nicely的Dispose(void),存在长期争论。鉴于您的示例完全是调用Dispose(void),您应该在取消引用之前为对象的每个实例调用它。