[英]Breaking C# references
我想知道何時以及為什么引用在C#中被破壞了?
以下代碼示例強調了這一點:
StringBuilder a = null, b = null;
a = new StringBuilder("a");
b = a;
b.Append("b");
b = null;
Console.WriteLine(a != null? a.ToString() : "null");
Console.WriteLine(b != null ? b.ToString() : "null");
//Output:
ab
null
為什么,對於這個例子, b
對a
的引用不會導致a
也為null
?
您需要區分變量 , 引用和對象 。
這一行:
b = a;
設置的值b
的值設置為a
。 該值是參考。 它是對象的引用。 此時, 通過 a
或b
對該對象進行更改只會對同一對象進行更改 - 這些更改也可以通過a
或b
,因為它們仍然具有對同一對象的引用。
它們就像兩張紙,上面寫着相同的住宅地址 - 兩個變量彼此之間沒有任何關系,它們碰巧由於前一行而具有相同的值。
所以,當我們在這一行上更改b
的值時:
b = null;
這只會改變b
的值。 它將b
的值設置為空引用。 這使得不改變的任一值a
或 StringBuilder
其中的舊值對象b
提及。
我有一篇文章詳細介紹了這一點 ,你會發現它很有用。
您需要分別考慮引用和對象 。 有一個對象, StringBuilder
。 引用本質上是對象的內存位置(給出或采取一些名義上的抽象),其值為某個大整數。 你有兩個引用變量。
StringBuilder a = null, b = null; // both variables empty
a = new StringBuilder("a"); // a ref to the obj, b empty
b = a; // copy value (ref) of a to b: a and b both ref to obj
b.Append("b"); // no change to either VARIABLE; the OBJECT has changed state
b = null; // clear the variable b; a still points to the obj
另請注意,即使我們添加
a = null; // both variables empty
我們還有2個空變量和一個對象; 對象不會神奇地消失 - 這就是垃圾收集(GC)的用途。
b沒有對a的引用。 沒有“a”可以參考。 你在內存中有一個對象 (stringbuilder)和兩個引用它的不同變量 。 線b = a
在a中復制參考,並將其分配給b。
當你設置b = a;
,你說的是“ b
指向a
也指向內存的對象”。 所以當你這樣做時:
b.Append("b");
這樣做完全相同:
a.Append("b");
但它的真正含義(對於a
和b
)是:
[Object memory reference of a and b].Append("b");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.