2009-02-28 44 views
2

這是從喬恩斯基特的優秀個人的C#網站採取(http://www.yoda.arachsys.com/csharp/):問題有關引用類型

StringBuilder first = new StringBuilder(); 
StringBuilder second = first; 
first.Append ("hello"); 
first = null; 
Console.WriteLine (second); 

1)改變第一的價值不會改變的第二個價值 -

2)儘管雖然它們的值仍然是對同一對象的引用,但通過第一個變量對對象所做的任何更改都將通過第二個變量可見。

這是從同一句話中提取的。改變價值是什麼意思?我假定一個變量的值(例如int x = 4或5或45等)。

這是否意味着如果第一個指向另一個兼容對象,它不會對兩個有影響?

該頁面上的所有內容都很有意義,我認爲這只是我對英語解釋的一個問題。

由於

回答

4

first是對StringBuilder類型的對象的引用。也就是說,first存儲的值可用於引用堆類型爲Stringuilder的對象。 second是對類型StringBuilder的對象的另一個引用,其初始值是指與first所指的對象相同。

如果您更改first的值,您正在做的是更改指示對象的含義。也就是說,您正在使用first來引用不同的對象。這不會影響second;其價值不受first價值變化的影響。 (記住:中firstsecond值是最初有相同的指涉引用但就像與

int x = 1; 
int y = x; 
x = 2; 

不會改變的y的價值,改變first值不會改變second值。

在另一方面,當firstsecond指代相同的對象,對該對象的任何變化將通過兩個firstsecond可見。

這樣想吧。比方說,我創建一個文本文件first.html其內容

<a href="http://stackoverflow.com">Stack Overflow</a> 

,我發出命令copy first.html second.html。然後可以使用這兩個頁面來引用同一個網頁;通過遵循鏈接我們到達相同的指示物。如果對堆棧溢出主頁進行更改,則通過first.htmlsecond.html訪問主頁將允許我查看這些更改。但是,如果我再改first.html內容是

<a href="http://www.thedailywtf.com>The Daily WTF</a> 

然後我就可以不再使用first.html指堆棧溢出的主頁。而且,這種變化不會影響second.html的價值。它仍然是這些文件作爲參考類型的值,而最終desination作爲參照對象的內容

<a href="http://stackoverflow.com>Stack Overflow</a> 

思考。

0

對象本身的值和所述對象的內容之間的差異不明確。

例如,可以通過首先調用方法來更改第二個內容,例如在示例中對Append的調用中。但是,將第一個值設置爲null不會將第二個值設置爲null。

您可以通過編寫此代碼並在調試器中逐步完成此操作,從而輕鬆看到此內容。

+0

我明白了。 「價值」意味着它的狀態 - 例如null,如果第一個設置爲,則不影響第二個。然而,第一個的內容確實起作用。 – dotnetdev 2009-02-28 00:42:24