2008-10-06 75 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()