2008-10-06 76 views
4

我正在开发一个Web应用程序,并遇到以下情况。循环和垃圾回收

Dim a as Object 
Dim i as Integer = 0 

Try 

    For i=1 to 5 

     a = new Object() 

     'Do stuff ' 

     a = Nothing 

    Next 

Catch 

Finally 

    a = Nothing 

End Try 

我是否需要在循环中执行a = Nothing或将垃圾收集器清理干净?

回答

12

在.NET中,您通常不需要需要来设置变量引用= Nothing(在C#中为null)。垃圾收集器将最终清理。引用本身在超出范围时将被销毁(无论是当您的方法退出或此类的对象已完成时)。请注意,这并不意味着对象已被销毁,只是对其引用。该对象仍然会被收集器非确定性地销毁。

但是,设置您的参考= Nothing将向.NET提供一个提示,即该对象可能是垃圾,并且不一定会伤害任何东西 - 除了代码混乱之外。如果你将它保存在那里,我建议从Try块中删除它;它已经在Finally区块中,因此将始终被调用。 (除了某些灾难性的例外;但在那些情况下,它也不会在Try区块中被调用!)

最后,我不得不承认我同意Greg:您的代码在没有这个的情况下会更干净。运行时提示您已完成引用是很好的,但肯定不是关键。老实说,如果我看到这个在代码审查,我可能有开发商正是如此改写:

Dim a as Object 
Dim i as Integer = 0 

For i=1 to 5 
    a = new Object() 
    'Do stuff 
Next 
+5

其实变量设置为空可能会导致对象的生命周期将被延长,而不是缩短(HTTP://博客。 msdn.com/csharpfaq/archive/2004/03/26/97229.aspx)。尽管该帖子的一般信息是正确的 - 不要麻烦设置为空。 – 2008-10-06 20:24:04

+0

Touche。 .NET JIT以其智能和效率继续让我感到惊喜! – 2008-10-07 01:59:39

2

不,你不需要它。 .NET有垃圾回收。而且由于它看起来像这个代码在方法范围内,所以垃圾收集将清理任何局部变量。

5

几乎没有必要明确地将Nothing分配给变量。垃圾收集器的工作是为你分配内存分配,特别是为了减轻你的责任。所以不,你不需要在循环内部分配a = Nothing

你也不需要在整个事物周围都没有指定Nothing的try/finally块。无论如何,运行时系统会照顾到这一点,这真是太多杂乱无章。

0

像其他人你上面说不需要明确设置你的变量无关,因为它是自动处理。但是,如果出于某种原因要强制GC收集,你可以运行这个命令:

System.GC.Collect()