在某些块中,在“弱链接”中创建一个匿名对象和对象:
//first object System.Random
string result = new Random().Next(0,1) == 1 ?
"equal 1":"sory, but not equal 1";
//second object System.Random
string result = ((Random)new WeakReference(new Random()).Target).Next(0,1) == 1 ?
"equal 1":"sory, but not equal 1";
GC.Collect();
垃圾收集后哪个评论标记的对象有更大的机会保持活力?
答案 0 :(得分:5)
在第二个示例中,假设Random
实例在WeakReference
构造函数完成之后和Target
属性之前立即收集1>}访问 - 毕竟,在那一点上没有强烈的参考。所以第二个代码无论如何都被打破了,IMO。
在这两种情况下,只要GC检测到任何内容都不会再访问任何数据,System.Random
对象就有资格进行垃圾回收 - 所以可能就在Next()
结束之前方法调用。此外,WeakReference
对象在使用Target
属性后立即有资格进行第二种情况的垃圾收集。
“更大的生存机会”并不是一个精确定义的概念 - 正如Servy的评论中所指出的,一个对象有或没有资格进行垃圾收集。在某些实现中,可以推断出最有可能发生的事情,但这样做通常会是一个坏主意,因为实现细节可以并且确实会发生变化。