【发布时间】:2016-06-09 12:39:13
【问题描述】:
我正在和WeakReference 和WeakReference<T> 闲聊。它们只适用于类(显然,reference),所以我用字符串做了一个示例(字符串是 .Net 中的一个类)。
当我运行以下代码 sn-p 时,它没有提供我预期的结果,这意味着 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 类进行了同样的尝试,结果是一样的。
为什么垃圾收集器没有声明字符串?
(GC.Collect() 确实声称所有代,外部 GC 调用为 -1(所有代))
【问题讨论】:
-
随意编辑标题,我不知道比这更好。
-
关于标题:没有对 WeakReference
和具有未引用值的 String 数据类型进行垃圾收集? -
@rfb 我不喜欢 WeakReference
上的垃圾收集,因为 WeakReference 上没有垃圾收集 -
@Mafii 但这正是您所期望的。反正只是一个建议
标签: c# .net reference garbage-collection weak-references