簡體   English   中英

打破C#引用

[英]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

為什么,對於這個例子, ba的引用不會導致a也為null

您需要區分變量引用對象

這一行:

b = a;

設置的值b的值設置為a 該值是參考。 它是對象的引用。 此時, 通過 ab對該對象進行更改只會對同一對象進行更改 - 這些更改也可以通過ab ,因為它們仍然具有對同一對象的引用。

它們就像兩張紙,上面寫着相同的住宅地址 - 兩個變量彼此之間沒有任何關系,它們碰巧由於前一行而具有相同的值。

所以,當我們在這一行上更改b的值時:

b = null;

只會改變b的值。 它將b的值設置為空引用。 這使得不改變的任一值a StringBuilder其中的舊值對象b提及。

我有一篇文章詳細介紹了這一點 ,你會發現它很有用。

變量b不必變量的引用a ,它具有到一個參考StringBuilder通過稱為對象a 這就是b=a做,分配給b通過引用的對象的引用a 只要是這種情況,當通過a使用對象時,通過b對對象的任何更改都是可見a

b被分配null ,不再有任何對象的引用,但a仍然保持其參考。

這是一張描繪這個的圖片:

參考

您需要分別考慮引用對象 有一個對象, 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");

但它的真正含義(對於ab )是:

[Object memory reference of a and b].Append("b");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM