对象的生命周期

时间:2014-02-14 17:07:49

标签: c#

在某些块中,在“弱链接”中创建一个匿名对象和对象:

//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();

垃圾收集后哪个评论标记的对象有更大的机会保持活力?

1 个答案:

答案 0 :(得分:5)

在第二个示例中,假设Random实例在WeakReference构造函数完成之后和Target属性之前立即收集}访问 - 毕竟,在那一点上没有强烈的参考。所以第二个代码无论如何都被打破了,IMO。

在这两种情况下,只要GC检测到任何内容都不会再访问任何数据,System.Random对象就有资格进行垃圾回收 - 所以可能就在Next()结束之前方法调用。此外,WeakReference对象在使用Target属性后立即有资格进行第二种情况的垃圾收集。

“更大的生存机会”并不是一个精确定义的概念 - 正如Servy的评论中所指出的,一个对象有或没有资格进行垃圾收集。在某些实现中,可以推断出最有可能发生的事情,但这样做通常会是一个坏主意,因为实现细节可以并且确实会发生变化。