2012-03-29 6 views
3

Ich habe mich gefragt, etwa: Wie GC das Objekt Lazy siehtLazy <T> in den Augen von GC?

dh:

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

„Faule Instanziierung“ Schaffung eines Objekts, bis die Zeit aufschiebt es tatsächlich

zugegriffen wird

f Does Hier ist eine Wurzel für das Objekt? (was bedeutet, dass er nicht GC'ed sein wird)?

(das Objekt bis zu diesem Zeitpunkt nicht ein anderer Code erstellt ... später auf einen Wert in sie setzen)

oder

GC sieht es als un-referenced/un- initialisiertes Objekt - und GCe'd es.

Ist es etwas, um das ich mich kümmern muss? (/ Furcht?)

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

Ich glaube nicht, dass "Lazy " in Bezug auf den GC in jeder Hinsicht etwas Besonderes ist. – CodesInChaos

Antwort

4

f ist in der Tat eine Referenz auf die Instanz Lazy<Foo>. Die gekapselte Foo Instanz ist separat, wird aber indirekt erreichbar gemacht.

Solange f existiert, dh es ist eine Wurzel oder es ist erreichbar, wird die Instanz nicht (kann nicht) gesammelt werden.

Es gibt wirklich nichts Besonderes in Bezug auf GC hier. Verwechsle Lazy nicht mit WeakReference.

+0

"Lazy Instantiation" verschiebt die Erstellung eines Objekts bis zu dem Zeitpunkt, zu dem es tatsächlich aufgerufen wird –

+0

@RoyiNamir - und das ist absolut egal. Beachten Sie, dass ich sagte "Lazy Instanz", nicht "Foo Instanz" –

+0

@RoyiNamir: Ja, aber "das Objekt" bezieht sich auf die Instanz von 'T', dass die' Lazy 'Instanz erstellen wird, nicht die' Lazy 'Beispiel sein Selbst. –