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
です。このテストが失敗する理由を誰かに教えてもらえますか?

編集:ありがとうstusmith

文字列への参照があります。これは定数であるため、おそらくインターンされており(つまり、動的に割り当てられていない)、収集されることはありません。

それでした。最初の行をに変更しました

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

そしてテストは合格します:-)

4

1 に答える 1

16

考えられる理由は 2 つあります。

  1. デバッグで実行しています。デバッグ中の参照は、リリース中よりも長く続き、おそらくあなたが思っているよりも長く続きます。
  2. 文字列への参照があります。これは定数であるため、おそらくインターンされ (つまり、動的に割り当てられず)、収集されることはありません。
于 2008-10-16T12:52:37.500 に答える