2016-06-09 74 views
2

我正在與WeakReferenceWeakReference<T> Tyoing。他們只使用類(顯然,參考),所以我做了一個字符串示例(字符串是.Net中的一個類)。爲什麼仍然有這個字符串的引用?

當我運行下面的代碼片段,它沒有提供結果我所料,在該WeakReference仍含有該字符串的含義。

string please = "wat"; 
    WeakReference<string> test = new WeakReference<string>(please); 
    string testresult; 
    please = null; 
    GC.Collect(); 
    bool worked = test.TryGetTarget(out testresult); 
    Console.WriteLine("it is " + worked); 

結果: 「這是真的」

現在,當我創建的字符串圍繞一個簡單的包裝類:

class TestWeakStuff 
{ 
    public string Test { get; set; } 
} 

,並用它來代替字符串,它沒有返回我的預期的結果:

TestWeakStuff testclass = new TestWeakStuff() { Test = "wat" }; 
    WeakReference<TestWeakStuff> test2 = new WeakReference<TestWeakStuff>(testclass); 
    TestWeakStuff testresult2; 
    testclass = null; 
    GC.Collect(); 
    bool worked2 = test2.TryGetTarget(out testresult2); 
    Console.WriteLine("2nd time is " + worked2); 

結果:「第二次是假的」

我嘗試同樣與非通用類WeakReference,結果是一樣的。

爲什麼String沒有被垃圾收集器聲明?

GC.Collect()並要求各代,外部呼叫模式是-1(萬代))

+0

隨意編輯標題,我不知道比這更好。 – Mafii

+0

關於該標題:WeakReference 上沒有垃圾回收以及具有未引用值的字符串數據類型? – rfb

+1

延伸閱讀:每個人都認爲關於垃圾收集錯誤的方式(https://blogs.msdn.microsoft.com/oldnewthing/20100809-00/?p=13203) – theB

回答

1

字符串文字不是一個很好的候選人,以測試GC行爲。字符串文字被添加到CLR上的intern pool。這導致每個不同的字符串文字只有一個對象存在於內存中。這是一個優化。實習生池中的字符串被永久引用,永遠不會被收集。

字符串不是普通的類。它們是運行時的內在因素。

你應該能夠new string('x', 10)這將創建一個新的對象,每次來測試它。這是保證如此。有時,這被用於使用不安全的代碼寫入字符串,然後將它們發佈到其他代碼。也可以使用本機代碼。

這可能是最好的完全放棄測試字符串。您獲得的結果並不特別有趣,或者保證在運行時更改時保持穩定。

您可以用new object()這將是測試它最簡單的方法測試。

相關問題