2014-08-31 51 views

回答

8

這正是發生了什麼,只是字符串文字拘留,無法再GC'd。

另外,對象沒有名稱;相反,它將創建一個新的String實例並使您的變量引用它。

+1

「另外,對象沒有名稱;相反,它會創建一個新的String實例並使您的變量引用它。」啊,是的,非常好。沒有意識到他們永遠不會被GC'd。在內存資源方面,我應該關注自己嗎? – rory 2014-08-31 20:23:28

+2

@ rory:不;你可能沒有字符串**文字**。 – SLaks 2014-08-31 20:27:51

13

Schabse的答案當然是正確的;然而,我會進一步澄清你的想法。

這是否意味着第二行的測試與第一行的測試不是同一個對象?

是的。 test變量的名稱。 (請記住,並非所有變量都有名稱,但是這個名稱有。)變量存儲。 A 參考是一種。您首先將參考分配給test的特定字符串。然後在下一行分配一個不同的參考。

編譯器創建了一個字符串對象的新實例,並將其稱爲'test',並將第一個'test'發送到垃圾回收器?

編譯器沒有這樣的事情。 A 編譯器是將用一種語言編寫的程序翻譯成用另一種語言編寫的程序的裝置。 C#編譯器將C#轉換爲包含MSIL代碼和元數據的可移植可執行文件。該代碼指示CLR創建字符串。

CLR中,運行該程序片段的情況下,所創建的字符串對象的新實例並把它稱爲「測試」

否,CLR創建的string一個新實例並分配參考該實例添加到名爲test的變量中。 實例不是具有名稱的東西。存儲對實例的引用的變量是具有名稱的變量。不要混淆兩者!如果我有一個名爲的地址簿我的地址簿,並且地址簿中包含地址「華盛頓特區賓夕法尼亞大街1600號的巴里奧巴馬」,則該地址的房屋名稱仍然是白宮而不是我的地址簿

CLR創建了一個新的字符串對象實例,爲它分配一個引用來測試,它已經包含了一個引用。由於之前引用的對象現在不再被任何根引用,垃圾收集器立即釋放它。

編號首先,不需要釋放對文字字符串的引用。其次,假設拋出的引用不是字面的,垃圾收集器運行時按照自己的時間表運行。沒有要求釋放字符串有史以來。當然,當進程終止時 - 如果它結束 - 那麼所有的進程內存將被釋放。

所以現在我們可以解決您原來的問題:

如果字符串是不可變的,這是否意味着一個價值重新分配創建了相同名稱的新字符串對象?

的問題是不連貫的,因爲(1)引用語義是完全獨立的串是否是不可變的,(2)對象沒有名稱,變量有名字。你能改說你的問題嗎?

這是我需要關注的東西嗎?

對C#基礎知識的正確理解絕對是你如果想成爲C#程序員時應該關注的東西。

+0

非常感謝您的澄清 – rory 2014-09-01 14:26:17

相關問題