对象的生命周期

Dim*_*zyr 0 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();
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 5

在第二个例子中,假设在构造函数完成之后和访问属性之前立即收集Random实例是可能的- 毕竟在那一点上没有强引用它.所以第二个代码无论如何都要破了,IMO.WeakReferenceTarget

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

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