Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个";=新";在vb.net中使用相同的变量。垃圾收集会处理吗?如何处理?_.net_Vb.net_Garbage Collection - Fatal编程技术网

多个";=新";在vb.net中使用相同的变量。垃圾收集会处理吗?如何处理?

多个";=新";在vb.net中使用相同的变量。垃圾收集会处理吗?如何处理?,.net,vb.net,garbage-collection,.net,Vb.net,Garbage Collection,x=whatever(1)发生了什么 垃圾收集是否找到指向第一个新对象的指针并销毁它?垃圾收集最终将找到旧对象并完成它。这与Disposition不完全相同,它要求对象在放入终结器线程时能够在额外的GC生成中生存。(见下面的长话短说) 您应该使用不同的变量名(无论如何,这是一个很好的做法)并同时处理这两个变量名,或者在用第二个变量覆盖变量之前先处理第一个变量名 最好的方法是使用确保对象已被明确处理,这样您根本不需要try/catch Dim x as whatever Try x

x=whatever(1)发生了什么


垃圾收集是否找到指向第一个新对象的指针并销毁它?垃圾收集最终将找到旧对象并完成它。这与Disposition不完全相同,它要求对象在放入终结器线程时能够在额外的GC生成中生存。(见下面的长话短说)

您应该使用不同的变量名(无论如何,这是一个很好的做法)并同时处理这两个变量名,或者在用第二个变量覆盖变量之前先处理第一个变量名

最好的方法是使用确保对象已被明确处理,这样您根本不需要try/catch

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的引用。然后在将来的某个时间点,GC运行时,它检测到第一个x没有任何根。如果对象具有终结器,则它会在终结器线程上放置对该对象的引用-请注意,仅仅因为对象是一次性的,并不一定意味着该对象本身具有终结器r、 但是对象或子对象中的某个地方几乎肯定会有一个。这意味着对象或子对象在GC运行后仍然存在,因此升级到第1代。然后终结器运行并终结终结终结器线程上的所有对象,从而释放其非托管的内存。然后,您必须等待GC将再次运行,但这一次您必须等待第1代收集,这是非常罕见的,但当它最终发生时,您的对象将最终被收集]

关于如何/何时/是否需要调用Dispose(void)有一个长期的争论。您的示例是调用Dispose(void)总之,在取消引用对象之前,您应该为对象的每个实例调用它。

感谢您指出我的博客文章。但是,您上面的代码是错误的,我将对其进行否决。正确的模式是,除非这是winforms应用程序,并且
whatever
是字体或其他东西,或者
whatever
是字体或其他东西WCF客户端代理是使用
Using
块。我甚至会与Kim Hamilton甚至Jeffrey Richter争辩说,如果显式分配字体,它应该在Using块中进行处理。我认为Kim提出的我喜欢的观点是,您不应该为所有一次性对象自动调用dispose,但您应该仔细考虑呃,每种情况都有各自的优点,在某些受限的情况下不调用dispose。就我个人而言,我几乎一直倾向于调用dispose。是的,使用模式更合适,但是我的示例旨在演示两个对象的显式处理。虽然使用dispose处理对象,但它可能不是显而易见的我已经删除了我的示例,因此没有人认为这是一个可接受的设计模式。我还没有尝试使用,但测试这一点的整个想法来自于我一次处理一个对象,它们消失了。如果我创建了一个新对象,那么dispose不会消失。即使这些变量是通过val或在潜艇中创建的,如果没有东西消失,它们就不能被处置。
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