2012-08-03 56 views
0

我有一個關於垃圾收集的問題,當一個對象看起來超出了範圍,但仍然可以保持活着狀態,因爲其他類仍然持有對它的引用。請查看下面的代碼。謝謝。作爲參數傳入的對象 - 垃圾回收.Net

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的引用。如果我錯了,請糾正我。

回答

0

沒有收集到任何東西,因爲您的對象都沒有被初始化,因此都是Nothing。如果它們被初始化了,那麼是的,一個會繼續存在,因爲它會繼續引用它,另一個則不會,因爲它不會引用它。

+0

我很抱歉,編輯我的問題 – swiftgp 2012-08-03 18:50:21

+0

所以,當你在一個對象作爲參數傳遞它並不意味着類是持有對其的引用 – swiftgp 2012-08-03 18:52:06

+0

@ user1556110:否。該方法持有對其的引用。 – 2012-08-03 18:52:24

0

它通過引用傳遞變量,它會將地址傳遞給另一個方法,其中另一個變量(Obj1Reference)將指向傳遞的地址並執行操作。

,所以我認爲,當應用程序執行完畢後,垃圾收集器將清理OBJ1,OBJ2

+0

我以爲只有當你期望對象被完全改變而不是被操縱時才使用ByRef,例如使對象指向另一個對象,以便它在調用類中也被改變。 – swiftgp 2012-08-03 21:04:50