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),清除引用,那么对它的唯一引用是来自访问器 - 为什么它不能被收集?它包含实际对象,而不是它的副本。

4

1 回答 1

1

您没有将班级中的 checkProcess_Accessor 字段清空,因此它以及它具有链接的所有内容仍然存在并且无法收集。

PrivateObject 显然保留了对它正在传递的 checkProcess 的引用,而 checkProcess_Accessor 必须保留对 PrivateObject 的引用。您仍然可以通过访问器和 PrivateObject 访问 checkProcess(尽管如果所有引用都是私有的,您可能需要使用反射来这样做),因此无法收集对象。

顺便尝试强制垃圾收集是一个非常糟糕的主意,但我相信你有这样做的正当理由。

于 2012-10-17T13:20:15.150 回答