2011-07-04 145 views
5

在C#中,當我有兩個對象OBJ1OBJ2List<string>和我同時將與這些對象相同的List<string>對象。C#垃圾收集對象引用

如果我對obj1的引用超出了作用域,但是我對obj2的引用沒有引用,obj1是否仍然符合垃圾回收的條件,還是存在一些依賴性問題,因爲仍然存在對該對象的引用?

+6

+!很好的問題,但是請你用代碼寫出來嗎? – harpo

+1

看起來像一個很好的問題,但我不確定,因爲目前還不清楚* obj1 *,* obj2 *和List 對象是怎麼回事......你能澄清嗎? – Matt

回答

3

在你的情況,obj1必須符合進行垃圾回收。

您需要查看Jon Skeet'sanswer這裏。它清楚地解釋了垃圾收集如何在對象引用上工作。

Object's Lifetime in C#上給你一個很好的教程。

+0

'List '或者指向'List '的指針? – Enigmativity

1

只要沒有對obj1本身的引用,obj1就應該有資格進行垃圾回收。

+0

如果您的意思是由'obj1'定義的指針,而不是'obj1'指向的'List '的實例,則這是真的。 – Enigmativity

+0

@Enigmativity:當然! :) – Mrchief

-1

如果obj1是列表的成員,則直到父列表被垃圾收集後纔可用於垃圾收集。

所以:

List<string> l = new List<string>(); 

string a = "one"; 
l.Add(a); 

{ 
    string b = "two"; 
    l.Add(b); 
} 

在這個月底上市,a在範圍,b超出範圍,但二者之間仍然有在列表中l引用,因此既不符合垃圾收集。

+0

不知道爲什麼這是downvoted - 評論爲什麼它是錯的或一個不好的答案會很好。 –

1

如果我的參考OBJ1超出 範圍,但我自己參考OBJ2不 不,是OBJ1仍然有資格申請 垃圾收集,或者是有一些 依賴性問題,因爲有 仍然參考列表 對象?

如果我理解正確的話你的意思都obj1obj2List<string>類型,都指向同一個List<string>實例。

obj1超出範圍時,仍然會有obj2作爲對List<string>實例的活動引用,因此該列表不能被垃圾收集。

如果obj1是堆(即其某個屬性)上的引用類型的一部分,則它佔用的內存空間可能會作爲外部對象的一部分進行垃圾回收。如果它只是堆棧中的引用,GC將不會涉及,因爲當obj1超出範圍時,堆棧將在方法調用結束時解除。

請記住,obj1只是一個對堆上對象的引用(用指針的方式) - 只有當沒有引用指向它時,此對象纔可能被垃圾回收。

0

有記憶三種用法在這個問題定義:

  • 一個指向名爲obj1List<string>實例。
  • 指向名爲obj2List<string>實例的指針。
  • List<string>的實例。

如果obj1超出範圍,但obj2沒有,那麼只有以下留在垃圾回收之後:

  • 一個指向名爲obj2List<string>實例。
  • List<string>的實例。

重要的是要記住,C#抽象了指針在大多數情況下的概念,讓您可以放心地認爲obj1obj2List<string>而不是指針是很重要的,但是指針他們。