2013-11-20 86 views
6

GC.KeepAlive() on MSDN爲什麼最後調用GC.KeepAlive,而不是一開始?

代碼這種方法在最後,而不是年初, 指令,其中OBJ必須是可用的範圍內的。

它爲什麼會有這種非直觀的行爲?

+3

'參考資料指定的對象,這使得它不符合垃圾收集從目前常規的點開始,其中該方法是叫'這個定義很清楚。 –

+0

@AlexFarber是的,定義非常清晰。但我期望的是知道爲什麼它是這樣設計的。 – Doug

回答

17

因爲否則技術上 JIT和CLI可以確定該值之後不使用該值,並考慮該對象可行的收集。哎呀,編譯器可以決定完全刪除變量,並在上次使用後從堆棧中「彈出」它。

請注意,GC.KeepAlive實際上並沒有做任何事情。這是一種不透明的,不可操作的方法。重點在於,如果您以對象作爲參數調用不透明方法,該對象仍然需要在附近,即可到達,即不可收集。

下面是如何KeepAlive實施(除去一些無趣的屬性):

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

好的,我看到GC.KeepAlive只是一個虛假參考。但我不清楚爲什麼編譯器不能在對象上調用的最後一個方法實際返回後減少引用計數。請參閱:http://msdn.microsoft.com/en-us/library/system.gc.keepalive(v=vs.80).aspx – jeff7091

+0

@ jeff7091你意識到CLI中沒有引用計數,對吧?此外,'GC.KeepAlive'的意義不在於方法 - 常見的用法是有終結器的東西 - 例如一個計時器或追蹤器,您希望在某個時間內保持運行,而您不想被收集 –

相關問題