2013-11-20 32 views
6

Von GC.KeepAlive() on MSDN:Warum GC.KeepAlive am Ende anrufen, und nicht am Anfang?

-Code dieser Methode am Ende, nicht am Anfang des Bereichs von Anweisungen, wo obj zur Verfügung stehen müssen.

Warum hat es solch ein nicht intuitives Verhalten?

+3

'Referenzen des angegebene Objekt, das für die Garbage Collection von dem Anfang der aktuellen Routine zu dem Punkt, dass diese Marke nicht macht, wenn dieses Verfahren genannt "Diese Definition ist ziemlich klar. –

+0

@AlexFarber Ja, die Definition ist ziemlich klar. Aber was ich erwarte, ist zu wissen, WARUM es so entworfen wurde. – Doug

Antwort

17

Da sonst technisch die JIT und CLI können bestimmen, dass der Wert nach diesem Punkt nicht verwendet wird, und betrachten Sie das Objekt für die Sammlung geeignet. Verdammt, der Compiler könnte entscheiden, die Variable komplett zu entfernen und sie nach der letzten Benutzung einfach vom Stapel zu holen.

Beachten Sie, dass GC.KeepAliveeigentlich nichts tun. Es ist eine undurchsichtige, no-op-Methode. Der Punkt ist, dass, wenn Sie eine undurchsichtige Methode mit einem Objekt als Parameter aufrufen, das Objekt immer noch um herum sein muss, d.h. erreichbar, d. H. Nicht sammelbar.

Hier ist, wie KeepAlive implementiert ist (mit einigen uninteressant Attributen entfernt):

[MethodImpl(MethodImplOptions.NoInlining)] 
public static void KeepAlive(object obj) 
{ 
} 
+0

Ok, ich sehe, wie GC.KeepAlive nur eine falsche Referenz ist. Aber mir ist nicht klar, warum der Compiler die ref-Zählung nicht verringern kann, NACHDEM die letzte aufgerufene Methode das Objekt tatsächlich zurückgibt. Siehe: http://msdn.microsoft.com/en-us/library/system.gc.keepalive(v=vs.80).aspx – jeff7091

+0

@ jeff7091 Sie erkennen, dass es keine ref-count in der CLI gibt, oder? Der Punkt von 'GC.KeepAlive' geht auch nicht über Methoden - eine allgemeine Verwendung sind Dinge, die Finalizer haben - zum Beispiel ein Timer oder Tracer, den Sie für die Dauer von etwas, das Sie nicht wollen, weiterlaufen lassen möchten gesammelt werden –

Verwandte Themen