2012-10-17 66 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(尽管如果所有引用都是私有的,您可能需要使用反射),因此无法收集对象。

尝试强制垃圾回收是一个非常糟糕的主意,但我相信你有一个合理的理由来做到这一点。