循环和垃圾收集

时间:2008-10-06 18:02:49

标签: .net vb.net garbage-collection loops

我正在开发一个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或者垃圾收集器是否会清理?

5 个答案:

答案 0 :(得分:12)

在.NET中,您通常不会需要在C#中设置变量reference = Nothingnull)。垃圾收集器最终会清理干净。当它超出范围时(或者当你的方法退出时或者当这个类的对象被最终确定时),它将被销毁。注意,这并不意味着对象被破坏,只是参考它。该对象仍将被收集器非确定性地销毁。

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

最后,我必须承认我同意格雷格:没有这个,你的代码会更清晰。使用引用完成运行时的提示很好,但肯定不是关键。老实说,如果我在代码审查中看到这一点,我可能会让开发人员重写它:

Dim a as Object
Dim i as Integer = 0

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

答案 1 :(得分:5)

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

你也不需要try/finally块来为整个事物分配任何东西。这实际上只是运行时系统将要处理的额外混乱。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

GC会清理它。

答案 4 :(得分:0)

与上面提到的每个人一样,您不需要将变量显式设置为空,因为它是自动处理的。但是,如果出于某种原因想要强制GC收集,可以运行:

System.GC.Collect()