2012-12-28 84 views
1

我有一個類Simple,它包含一個整數,number。 使用此代碼:取消對對象的所有引用

Simple b = new Simple(); 
List<Simple> list = new List<Simple>(); 
list.Add(b); 
b.number = 6; 
b = null; 
Debug.WriteLine("The value of b is " + b); 
Debug.WriteLine("And the value of the clown in the list is " + list[0].number); 

的(1)調試返回The value of b isAnd the value of the clown in the list is 6

我可以假設通過將b添加到list,然後存儲對b的引用。然後,通過取消blist仍然包含對該對象的引用,它是b,因此可以打印出number的值。

但是,如果我可以更改b的成員,並且已將該參考反映在列表中,那麼b = null爲什麼不反映list[0]的值?我只能假設這與價值和參考有關。

幫助任何人?

+1

這不是一個真正的問題;這只是參考如何工作的一個例證。 b和列表條目是對象的引用。更改參考不會更改對象;只有改變引用的對象才能改變對象。 – antlersoft

+0

您是否嘗試過更改'b'的成員以查看會發生什麼? –

+0

@ Fls'Zen - 不是'b.number = 6;'改變成員? – riktor

回答

4

blist[0]都是引用存儲器中相同位置的變量。當您設置b = null時,您將設置bnull的引用。 list[0]仍然指向內存中的原始位置並保持不變。

當您更改b的屬性,(比如b.A)你實際上是說

獲取任何對象B指向和更新財產A.

當您訪問A通過list[0],你是說

去得到任何列表[0]指向並讓我A屬性。

編輯:再舉一個例子,如果b = someObjectlist[0] = someObject,設置b = someOtherObject不會改變list[0] ... list[0]仍然指向someObject

因此,要回答您的問題,您必須將b = nulllist[0] = null設置爲「null」它們都引用的對象。儘管如此,它並沒有達到你想要的效果。所做的只是將內存中的對象孤立起來,並允許Garbage Collector隨時清理它。

+0

所以我假設訪問'b'和'list [0]'指向的'base'對象是不可能的,並且將它設置爲空值? – riktor

+0

@riktor - 對象不能爲空;只有引用可以爲null – antlersoft

+0

@riktor:如果清除對某個對象的所有引用,並調用[GC.Collect()](http://msdn.microsoft.com/zh-cn/library/xe0c2357.aspx),則代表該對象的內存塊將被釋放,並且該對象本身將不再存在。 –

相關問題