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.KeepAlive
eigentlich 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)
{
}
'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. –
@AlexFarber Ja, die Definition ist ziemlich klar. Aber was ich erwarte, ist zu wissen, WARUM es so entworfen wurde. – Doug