5
[TestMethod]
public void Memory()
{
    var wr = new WeakReference("aaabbb");
    Assert.IsTrue(wr.IsAlive);
    GC.Collect();
    GC.Collect();
    GC.Collect();
    GC.Collect();
    GC.Collect();
    Assert.IsFalse(wr.IsAlive); //<-- fails here
}

它是 .NET 3.5 SP1
谁能告诉我为什么这个测试失败了?

编辑:谢谢斯图史密斯

您有一个对字符串的引用,因为它是一个常量,所以它可能是被保留的(即不是动态分配的),并且永远不会被收集。

就是这样。将第一行更改为

var wr = new WeakReference(new object());

并且测试通过了:-)

4

1 回答 1

16

我可以想到两个可能的原因:

  1. 您正在调试中运行。调试中的引用比发布中的引用持续时间更长,并且可能比您想象的更长。
  2. 您有一个对字符串的引用,因为它是一个常量,所以它可能是被保留的(即不是动态分配的),并且永远不会被收集。
于 2008-10-16T12:52:37.500 回答