【问题标题】:objects passed in as parameters - garbage collection .Net作为参数传入的对象 - 垃圾收集.Net
【发布时间】:2012-08-03 18:47:19
【问题描述】:

我有一个关于垃圾回收的问题,当一个对象似乎超出范围但由于其他类仍然持有对它的引用时可能仍然存活。请仔细阅读下面的代码。谢谢。

Public Class MainForm

    Private Sub Work
         Dim Obj1 as New DataTable
         Dim Obj2 as New DataTable

         Helper.TestMethod1(Obj1)
         Helper.TestMethod2(Obj2)
    End Sub

End Class

Public Class Helper

     Private Shared Obj1Reference as Object

     Public Shared Sub TestMethod1 (ByVal obj1Ref as Object)
         Obj1Reference = obj1Ref
     End Sub

     Public Shared Sub TestMethod2 (ByVal obj2Ref as Object)
          'Do Something with obj2Ref
     End Sub

End Class

在 Work 方法退出后,是否将 Obj1 和 Obj2 都放入垃圾回收队列中。据我了解,Obj2 已放入队列,但 Obj1 未放入队列,因为静态帮助程序类持有对 Obj1 的引用。如果我错了,请纠正我。

【问题讨论】:

    标签: .net vb.net


    【解决方案1】:

    没有任何东西被收集,因为你的对象都没有被初始化,因此都是Nothing。如果它们被初始化,那么是的,一个会继续存在,因为它会继续引用它,而另一个不会,因为它不会引用它。

    【讨论】:

    • 所以当你传入一个对象作为参数时,并不意味着该类持有对它的引用
    • @user1556110:不。该方法持有对它的引用。
    【解决方案2】:

    如果您通过引用传递变量,它会将地址传递给另一个方法,其中另一个变量(Obj1Reference)将指向传递的地址并按照实现的方式进行操作。

    所以我认为当应用程序完成执行时,垃圾收集器会清理 obj1,obj2

    【讨论】:

    • 我认为我们仅在您希望该对象被完全更改而不是被操纵时才使用 ByRef,例如使对象指向另一个对象以便它在调用类中也被更改。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多