2008-10-16 56 views
4
[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
任何人都可以告訴我爲什麼這個測試失敗?WeakReference Bug?

編輯:謝謝stusmith

你有一個參考爲一個字符串, 它,因爲它是一個常數,是 可能扣留(即不是動態 分配),並且將永遠不會被 收集。

就是這樣。改變第一行

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

和測試通過:-)

回答

16

我能想到的兩個可能的原因把我的頭頂部:

  1. 你在調試運行。調試中的參考時間比發佈時間長,可能比您想象的要長。
  2. 你有一個字符串的引用,因爲它是一個常量,可能是被實施的(即不是動態分配的),並且永遠不會被收集。
+0

你可以通過改變弱引用來驗證第二個。 var wr = new WeakReference(new Random()。Next(50).ToString());你會看到測試通過 – mhoward 2015-04-01 19:00:42