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 还是垃圾收集器会清理干净?

4

5 回答 5

12

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

但是,设置您的引用 =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
于 2008-10-06T18:08:21.623 回答
5

几乎从不需要显式地将 Nothing 分配给变量。垃圾收集器的工作是为你处理内存分配,专门为你解除这个责任。所以不,你不需要a = Nothing在循环内分配。

您也不需要try/finally在整个事物周围分配 Nothing 的块。这实际上只是运行时系统无论如何都会处理的额外混乱。

于 2008-10-06T18:05:21.053 回答
2

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

于 2008-10-06T18:04:18.950 回答
0

GC 会清理它。

于 2008-10-06T18:07:41.890 回答
0

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

System.GC.Collect()
于 2008-10-06T18:40:13.213 回答