2013-08-22 58 views
3

我想這樣做是爲了測試我的代碼。我想我可以在弱引用對象周圍製作另一個包裝,但是更願意直接模擬原始對象被回收。如何強制WeakReference死亡?

這是我到目前爲止的代碼

var myString = "someString"; 
var myStringRef = new WeakReference(myString); 
myString = null; 
GC.Collect(); 
Assert.IsFalse(myStringRef.IsAlive) //I want this to pass, but it failed. IsAlive is still true. 

我能做些什麼,以迫使上述不失敗(即!IsAlive

的最後一行我有做家政一些框架邏輯基於弱關聯的狀態。我希望能夠測試該邏輯,爲此,我需要能夠隨意更改弱引用狀態 - 那麼我該怎麼做?

+0

不是一個確切的重複,而是一個[類似的問題](http://stackoverflow.com/questions/208387/weakreference-bug)已被問到。 –

回答

1

不是將字符串硬編碼到源文件中,而是通過外部源讀取它。例如,您可以在其中放置字符串並創建一個TestStrings.txt文件並使用它。

string myString = File.ReadAllText(@"TestStrings.txt");   

var myStringRef = new WeakReference(myString); 
myString = null; 

GC.Collect(); 
Assert.IsFalse(myStringRef.IsAlive); 

這應該返回false。正如在另一個答案中提到的,這確實是由於字符串實習。

通過閱讀來自外部來源的文本,字符串將不會在這裏被攔截,這似乎是您想要的測試。 (您可以使用String.IsInterned方法檢查字符串是否被禁用)。

+0

謝謝,這非常詳細。 – Alwyn

+0

不客氣:) – keyboardP

3

我不知道這有某種原因的事實,串被拘留,因爲下面的測試通過:

var myObject = new object(); 
    var myObjectRef = new WeakReference(myObject); 
    myObject = null; 
    GC.Collect(); 
    Assert.IsFalse(myObjectRef.IsAlive); 
+0

以下測試僅從.NET 4.5開始。 –

0

這樣做,我需要能夠改變在WeakReference的狀態將

你可以建立一個圍繞WeakReference的抽象,使該可測試(使用一個接口或者「測試模式」,它允許您更改由IsAlive返回的值)。

2

默認情況下,字面字符串會被禁用,因此,儘管事實上您的空值爲myString,但實例仍然以實例表爲根。

有關如何處理實習內容的詳細信息,請參閱my answer