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

2 .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
Run Code Online (Sandbox Code Playgroud)

x =无论什么(1)会发生什么

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

Sim*_*ens 9

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

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

这样做的最好方法是使用using语句来确保对象被清除,这样你根本不需要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
Run Code Online (Sandbox Code Playgroud)

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