我正在與WeakReference
和WeakReference<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(萬代))
隨意編輯標題,我不知道比這更好。 – Mafii
關於該標題:WeakReference上沒有垃圾回收以及具有未引用值的字符串數據類型? –
rfb
延伸閱讀:每個人都認爲關於垃圾收集錯誤的方式(https://blogs.msdn.microsoft.com/oldnewthing/20100809-00/?p=13203) – theB