2012-10-17 138 views
0

美好的一天!測試訪問器垃圾回收

我在VS2010中使用MSTest。爲什麼訪問器在測試執行後不被垃圾收集?這是我的代碼。這很簡單。

[TestClass] 
public class CheckStringsWorkTest 
{ 
    CheckProcess checkProcess = null; 
    CheckProcess_Accessor checkProcess_Accessor; 

    [TestMethod] 
    public void StringShaveTest() 
    { 
     // MessageBox.Show("Start snapshot 1"); 

     checkProcess = new CheckProcess(); 

     checkProcess_Accessor = new CheckProcess_Accessor(new PrivateObject(checkProcess)); 

     checkProcess.Dispose(); 
     checkProcess = null; 
    } 

    [TestCleanup()] 
    public void RunAfterAllTests() 
    { 
    // If uncomment then GC is OK 
    //checkProcess_Accessor = null; 

    try 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
    } 
    catch { } 

    // MessageBox.Show("Start snapshot 2"); 
} 

據我瞭解 - 訪問器使用PrivateObject作爲包裝來保存實際的對象。但是,如果我將對象設置爲null(checkProcess),則清除引用,所以唯一引用它是來自訪問器 - 爲什麼它不能被收集?它擁有實際的對象,而不是它的副本。

回答

1

您並未清空類中的checkProcess_Accessor字段,因此它和它所鏈接的所有內容仍然存在並且無法收集。

PrivateObject顯然保持對它正在傳遞的checkProcess的引用,並且checkProcess_Accessor必須保持對PrivateObject的引用。您仍然可以通過訪問器和PrivateObject訪問checkProcess(儘管如果所有引用都是私有的,您可能需要使用反射),因此無法收集對象。

嘗試強制垃圾回收是一個非常糟糕的主意,但我相信你有一個合理的理由來做到這一點。