2014-04-07 81 views
1

所以我正在閱讀Jon Skeet關於C#中參數傳遞的文章,他做了下面的例子來解釋引用類型是如何工作的,但是我無法將它包裹起來。需要關於參考類型的一些說明

StringBuilder first = new StringBuilder(); 
first.Append("hello"); 
StringBuilder second = first; 
first.Append(" world"); 
first = new StringBuilder("goodbye"); 
Console.WriteLine(first); // Prints goodbye 
Console.WriteLine(second); // Still prints hello world 

當我們分配second變量的值,我們只是值設置爲StringBuilder對象的引用?

而且作爲獎金的問題,如果我們要改變second變量到別的參考(將其設置爲例如空值),將在參考第一StringBuilder對象則是無法彌補的?或者有沒有辦法檢索某個類型的所有創建的對象?

+0

你的獎金問題不是很清楚。你是說如果你願意的話:'StringBuilder second = first; second = null;'例如? –

+0

正是這正是我的意思,我會編輯澄清。 –

回答

3

當我們賦予第二個變量的值,我們只是 設置該值到StringBuilder對象的引用?

是。我們只需將指針複製到包含「hello world」的內存中。

,如果我們將在第二個變量的引用更改爲其他 ,該會參考第一StringBuilder對象則是無可挽回的 ?或者有沒有辦法檢索到某個類型的所有創建的對象 ?

是的,由它分配的內存將成爲垃圾收集的候選對象,因爲沒有任何指針引用它。

+0

所以如果我正確地理解了你的話,那麼只要不再有指向它的指針,GC就會處理這個對象?這或多或少是即時的嗎? –

+1

@OverlyExcessive - 不,它*不*即時。它會在「未來某個時候」發生,也許內存壓力變高(系統需要額外的內存)或有空餘時間清理。 –

+0

@OverlyExcessive:如果它最終進入第二代,它甚至可能根本不會發生,所以你會得到一個內存泄漏。[垃圾回收的基礎](http://msdn.microsoft.com/en-us/library/vstudio/ee787088%28v=vs.100%29.aspx#generation) – Tigran

0

first = new StringBuilder("goodbye"); 

減免這兩個對象之間的連接。

所以首先有goodbye和第二有hello world

1
StringBuilder second = first; 

second變量現在保持在存儲器中作爲first變量的參考同一個地方。

然而,這條線:

first = new StringBuilder("goodbye"); 

現在說first得到一個全新的基準,以一個新的對象,從而打破firstsecond之間的連接。