【问题标题】:Loops and Garbage Collection循环和垃圾收集
【发布时间】:2008-10-06 18:02:49
【问题描述】:

我正在开发一个网络应用程序,我遇到了以下情况。

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

【问题讨论】:

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


    【解决方案1】:

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

    但是,设置您的引用 = 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
    

    【讨论】:

    • 实际上将变量设置为 null 可能会导致对象的生命周期延长而不是缩短 (blogs.msdn.com/csharpfaq/archive/2004/03/26/97229.aspx)。虽然帖子的一般信息是正确的 - 不要费心将其设置为 null。
    • 触摸。 .NET JIT 继续以其智能和效率让我感到惊讶!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        GC 会清理它。

        【讨论】:

          【解决方案5】:

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

          System.GC.Collect()
          

          【讨论】:

          • 强制垃圾回收可能是一个非常糟糕的主意。 (它肯定是在 Java 中!0
          猜你喜欢
          • 1970-01-01
          • 2016-05-31
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          • 2016-01-05
          • 2011-11-12
          • 1970-01-01
          相关资源
          最近更新 更多