Ленивый <T>в глазах ГК? - PullRequest
3 голосов
/ 29 марта 2012

Мне было интересно узнать, как GC видит Lazy объект

, т. Е.:

 Lazy<Foo> f = new Lazy<Foo>( );

«Ленивая инстанциация» откладывает создание объекта до временик нему фактически обращаются

Есть ли f здесь корень для объекта?(что означает, что он не будет GC'ed)?

(объект не создан к этому времени ... какой-то другой код поместил в него значение позже)

или

GC видит его как объект без ссылок / без инициализации - и GCe'd его.

Это то, что мне нужно позаботиться?(/ боязнь?)

 public class Foo
    {
        public int ID { get; set; } 
        public Foo()
        {
           ID = 1;
        }
    }

1 Ответ

4 голосов
/ 29 марта 2012

f действительно является ссылкой на экземпляр Lazy<Foo>.Инкапсулированный экземпляр Foo является отдельным, но становится доступным косвенно.

Пока существует f, то есть он является корнем или доступен, экземпляр не будет (не может быть) собран

Здесь нет ничего особенного в отношении GC.Не путайте Lazy с WeakReference.

...