2012-01-31 51 views
-2

改變我創建2個變量與名稱一個b然後我初始化變量一個與值「開始」後來我分配可變a to variable b and finally 我變變的價值年底但變量b不改變, 而一個b是引用類型!串不被參考

string a = "start"; // Declare and initialize a variable 
string b = a; // Copy the variable's value to a new variable 
a = "end"; // Modify the value of the original variable 
//variable b don't change!! 

爲什麼這不按預期工作?

回答

6

這不是C#中字符串的工作方式,它們不是指針。更重要的是,字符串是不可變的,所以你不能改變它們的值,只是分配一個新的值。所以無論你想要做什麼,你都需要考慮到這一點。

比較運算符成功的事實是因爲您正在對每個字符串中包含的字符進行字面比較,而不是因爲它們在內存存儲意義上「相等」。

+2

該比較的工作原理是因爲C#重寫了該運算符http://msdn.microsoft.com/en-us/library/aa664728(v=vs.71).aspx,但您實際上是這麼說的。 – Joe 2012-01-31 22:09:37

+2

這裏沒有比較。 – 2012-01-31 23:54:38

+0

@Ron Warholic謝謝你的回答。您可能需要檢查問題的初始修訂版,以瞭解爲何甚至提到了比較。當你看到與你在問題中看到的不一致的評論時,可能會經常這樣做。 – kprobst 2012-02-01 06:15:05

1

如果確實需要通過引用(通過函數)更改字符串,則可以將ref放置在參數類型的左側。否則,你可以製作一個MutableString類,但我個人並沒有任何需要可變字符串。

你也可以嘗試StringBuilder,但那不是一個真正的字符串。

18

你誤解了「引用類型」的含義。

想想這樣。想象兩個房子,一個在芝麻街123號和一個在Pennyslvania大街1600號。這些是參考類型的對象。

現在想象你有兩張紙。有人說「123芝麻街」。有人說「賓夕法尼亞大街1600號」。那些不是房子;你不能移動到那些紙上。那些是參考房子。

現在想象你有兩個標有「a」和「b」的抽屜。這些是參考類型的變量。

您將「123芝麻街」紙放入抽屜「a」。你不要把房子放入抽屜裏。你把參考到房子裏放進抽屜。參考類型變量存儲對對象的引用。這就是爲什麼它被稱爲參考類型的變量。

然後,您將抽屜「a」中的紙張複印並放入抽屜「b」中。 「b」現在包含參考文獻的副本。現在抽屜「a」和「b」指同一棟房屋。如果你把那個房子塗成紅色,那麼這兩個抽屜裏的紙張所指的房子就是紅色的,因爲這兩份報紙只提到一間房子。有兩個對同一個房屋的引用,以及兩個包含一個引用的變量。

然後你將紙從抽屜「a」中取出並摧毀它。您將其替換爲標有「1600 Pennsylvania Avenue」的紙張。

這樣做並沒有改變任何關於抽屜「b」!當你說「b = a」時,意思是「將抽屜a中的參考文件複印並放入抽屜b」。它不是而不是的意思是「抽屜a和b現在是同一個抽屜的兩個不同名稱」。

這有道理嗎?

+0

它確實有道理,當然,棘手的部分是'System.String'和其他引用類型之間的區別恕我直言:引用類型通常通過*紙在抽屜*中進行比較,但字符串在這方面表現爲值類型並且實際檢查兩個房屋是否被塗成紅色。 – 2012-01-31 22:36:00

+5

@gdoron:不變性與它有什麼關係?假設我們用「var a = new [] {1,2,3}; var b = a; a = new [] {4,5,6};}替換了用戶的問題;嘿,即使a和b都是參考類型,b也不會改變。就此而言,按價值比較與什麼有什麼關係?問題是關於通過引用複製的性質,而不是關於不變性或比較。 – 2012-01-31 23:06:33