在C#中,當我有兩個對象OBJ1,OBJ2由List<string>
和我同時將與這些對象相同的List<string>
對象。C#垃圾收集對象引用
如果我對obj1的引用超出了作用域,但是我對obj2的引用沒有引用,obj1是否仍然符合垃圾回收的條件,還是存在一些依賴性問題,因爲仍然存在對該對象的引用?
在C#中,當我有兩個對象OBJ1,OBJ2由List<string>
和我同時將與這些對象相同的List<string>
對象。C#垃圾收集對象引用
如果我對obj1的引用超出了作用域,但是我對obj2的引用沒有引用,obj1是否仍然符合垃圾回收的條件,還是存在一些依賴性問題,因爲仍然存在對該對象的引用?
在你的情況,obj1
必須符合進行垃圾回收。
您需要查看Jon Skeet's
answer
這裏。它清楚地解釋了垃圾收集如何在對象引用上工作。
在Object's Lifetime in C#
上給你一個很好的教程。
'List
只要沒有對obj1本身的引用,obj1就應該有資格進行垃圾回收。
如果您的意思是由'obj1'定義的指針,而不是'obj1'指向的'List
@Enigmativity:當然! :) – Mrchief
如果obj1
是列表的成員,則直到父列表被垃圾收集後纔可用於垃圾收集。
所以:
List<string> l = new List<string>();
string a = "one";
l.Add(a);
{
string b = "two";
l.Add(b);
}
在這個月底上市,a
在範圍,b
超出範圍,但二者之間仍然有在列表中l
引用,因此既不符合垃圾收集。
不知道爲什麼這是downvoted - 評論爲什麼它是錯的或一個不好的答案會很好。 –
如果我的參考OBJ1超出 範圍,但我自己參考OBJ2不 不,是OBJ1仍然有資格申請 垃圾收集,或者是有一些 依賴性問題,因爲有 仍然參考列表 對象?
如果我理解正確的話你的意思都obj1
和obj2
是List<string>
類型,都指向同一個List<string>
實例。
當obj1
超出範圍時,仍然會有obj2
作爲對List<string>
實例的活動引用,因此該列表不能被垃圾收集。
如果obj1是堆(即其某個屬性)上的引用類型的一部分,則它佔用的內存空間可能會作爲外部對象的一部分進行垃圾回收。如果它只是堆棧中的引用,GC將不會涉及,因爲當obj1超出範圍時,堆棧將在方法調用結束時解除。
請記住,obj1只是一個對堆上對象的引用(用指針的方式) - 只有當沒有引用指向它時,此對象纔可能被垃圾回收。
有記憶三種用法在這個問題定義:
obj1
的List<string>
實例。obj2
的List<string>
實例的指針。List<string>
的實例。如果obj1
超出範圍,但obj2
沒有,那麼只有以下留在垃圾回收之後:
obj2
的List<string>
實例。List<string>
的實例。重要的是要記住,C#抽象了指針在大多數情況下的概念,讓您可以放心地認爲obj1
和obj2
爲List<string>
而不是指針是很重要的,但是指針他們。
+!很好的問題,但是請你用代碼寫出來嗎? – harpo
看起來像一個很好的問題,但我不確定,因爲目前還不清楚* obj1 *,* obj2 *和List對象是怎麼回事......你能澄清嗎? –
Matt