2014-02-14 72 views
0

在某些塊的創建中的「薄弱環節」的匿名對象和對象:終身對象

//first object System.Random 
string result = new Random().Next(0,1) == 1 ? 
    "equal 1":"sory, but not equal 1"; 

//second object System.Random 
string result = ((Random)new WeakReference(new Random()).Target).Next(0,1) == 1 ? 
    "equal 1":"sory, but not equal 1"; 

GC.Collect(); 

其中的意見加標籤的對象有一個更大的機會垃圾收集後活路?

+1

對象既可以收藏也可以不收藏。他們不會有百分之一的機會存活。這是確定性的。 – Servy

+0

也就是說,在語言標準中GC.Collect()的機制沒有明確的定義。 – dima

+0

有許多屬性已經定義好了,還有很多屬性作爲GC的實現細節。如果你想知道什麼是明確定義的,你可以自己閱讀規範。 – Servy

回答

5

那麼在第二個例子中,它的假設可能爲Random實例是立即收集WeakReference構造完成後和Target屬性進行訪問之前 - 沒有強引用它在這一點上,畢竟。所以第二個代碼無論如何都被打破了,IMO。

在這兩種情況下,只要GC檢測到什麼都不會再訪問它的任何數據,那麼System.Random對象就有資格進行垃圾回收 - 所以可能就在方法調用結束之前。此外,在使用Target屬性後,WeakReference對象有資格在第二種情況下進行垃圾回收。

「更大的生存機會」在這裏並不是一個精確定義的概念 - 正如Servy的評論所指出的,一個對象有資格或沒有資格進行垃圾回收。在某些實現中,可以推斷最有可能發生的事情,但考慮到實現細節可以並且確實會改變,這樣做通常是一個壞主意。