2013-03-24 84 views
0

如果我創建一個類的對象空對象是什麼意思?

A obj = new A(); 

,後來我給你null它:obj = null;

那麼它是什麼意思obj爲null?這是否意味着現在它指向無處,所有的內存都被釋放了?

+4

我用我的想象力來填寫問號。請隨時恢復我的更改。 – 2013-03-24 11:56:23

回答

4

這意味着它指向無處,內存有資格在未來某個未定義的時間由垃圾收集器重新分配。

+8

如果/當存儲在'obj'中的實例不存在其他引用時。 – 2013-03-24 11:55:51

+0

絕對....並假設沒有GC.Collect()或Dispose()或其他... – 2013-03-24 11:57:53

+0

...並保存垃圾收集器*一些*努力,你應該調用'obj.Dispose();'在設置'obj = null;'之前,明確告訴垃圾收集器它可以收集該內存。 – Sebivor 2013-03-24 11:57:59

7

obj現在指向參考內存位置null

null (C# Reference)上MSDN:

空關鍵字是表示一個空引用,一個不指向任何對象文字。

如果您還沒有指定它以前指向其他任何對象,該對象將有資格被GC收集。

2

在內部它意味着這個對象在不被視爲根。並且不會被添加到可用對象圖中。

因此,它將被視爲collect'able。 (非確定性時間)。

2

您需要明白引用類型(類)實際上是指向內存中數據的指針。實質上,它所做的就是將指針(它只是包含數據地址的一塊內存)設置爲零值,或者將其設置爲空值。

實際上,這意味着如果沒有其他數據引用,garbace收集器可能會在任何時候刪除它。

2

技術上,obj是當你說A obj = new A();

包含A類型的對象上堆內存的位置的替代名稱,但如果你然後說obj = null;然後obj現在引用行不通的。

此外,之前由類型A的對象佔用的內存(其中obj是別名)會在GC認爲它是正確的時間時由GC返回給操作系統。

2

這意味着obj指向無處,並且A類型的原始引用實例轉到gen0。 如果A是實現IDisposable的類型,那麼當調用Dispose時,A持有的資源將被釋放,並被抑制爲最終確定。如果一次性用品沒有明確處置,那麼它將等待最終確定。

如果之後的執行再次引用它,它來自gen1,然後可能是gen2,它的壽命將會更長。

gc開始收集垃圾的時候,gen0s將成爲第一選擇,然後是gen1,gen2。

3

null不是一個對象。這是一個沒有提及任何內容的特殊參考值。如果您嘗試使用null引用與對象進行通信,則會拋出錯誤,因爲沒有對象。

還有一種稱爲Null Object Pattern的設計模式,它被創建用於解決需要特殊情況的參考文獻的問題。 A 空對象在這個模式中是一個具有「中立」行爲的對象;也就是說,當被要求做某件事實際上什麼都不做,並且當被要求返回一個值時返回零,空字符串,空列表和其他安全的中立對象。

請勿混淆空對象與特殊null參考。

2

A obj = new A();

參考變量OBJ類型。您正在創建一個A的實例並將其參考分配給objobj現在引用A的實例。

的obj = NULL

上述分配說OBJ現在引用。那沒什麼。現在新創建的A實例超出了參考範圍,最終將會收集垃圾收集