GC眼中的Lazy<T>?

3
我想知道:如何让 GC 查看 Lazy 对象。
也就是说:
 Lazy<Foo> f = new Lazy<Foo>( );

"懒加载"将对象的创建推迟到实际访问时。这里的"f"是否是对象的根(意味着它不会被垃圾回收)?(此时对象尚未创建...某些其他代码稍后放置了一个值)。还是说GC认为它是未引用/未初始化的对象,因此对其进行了回收?这是我需要注意或担心的问题吗?
 public class Foo
    {
        public int ID { get; set; } 
        public Foo()
        {
           ID = 1;
        }
    }

4
我认为Lazy<T>在GC方面没有任何特殊之处。 - CodesInChaos
1个回答

4

f 确实是指向 Lazy<Foo> 实例的引用。封装的 Foo 实例是独立的,但通过间接方式使其可达。

只要 f 存在,即它是根或可达的,该实例就不会被回收。

这里与 GC 没有什么特别之处。不要将 Lazy 与 WeakReference 混淆。


“惰性实例化”将对象的创建推迟到实际访问它的时候。 - Royi Namir
@RoyiNamir - 这完全不重要。请注意,我说的是“Lazy<Foo>实例”,而不是“Foo实例”。 - H H
@RoyiNamir:是的,但是它所指的"对象"是Lazy<T>实例将创建的T的实例,而不是Lazy<T>实例本身。 - George Duckett
1
要注意的是,Lazy<T>并不特别,它只是另一种泛型类型,因此普通的GC规则适用。@RoyiNamir - George Duckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接