首先看代碼:
int a = 1; int b = a; a = 2; bool valOrRef = b == 2 ;//false;
可以看出int類型是實值型別,因為b並沒有跟隨a改變。
再看下面代碼:
string str11 = "qa"; string str22 = str11; str11 = "qaz"; bool valOrRef2 = str22 == "qaz"; //false
結果也是false,所以string 也是實值型別 value type。
再看下面代碼:
string str1 = "qaz"; string str2 = "qaz"; bool refequ = object.ReferenceEquals(str1, str2); //true
refequ等於true,如果string真的是value type,那麼refequ怎麼可能為true,因為請看下面代碼:
int a = 1; int b = 1; bool refequ2 = object.ReferenceEquals(a, b);//false
int是實值型別,這是確定無疑的,聲明了2個int變數。
這便自相矛盾了,怎麼解釋,string看著像value type,但是又看著像reference type。
微軟:string是reference type。那麼如何解釋看著像value type 呢?
請記住2點:
1)string對象,若值相同,則其引用地址相同。
2)string對象,若值不等,則其引用地址不等。
分析以上代碼:
string str11 = "qa";//str11指向了記憶體addressA,資料為qa; string str22 = str11;//str22也指向記憶體addressA str11 = "qaz";//str11新指向了記憶體addressB,資料為qaz bool valOrRef2 = str22 == "qaz"; //false
總結:
string最為顯著的一個特點就是它具有恒定不變性:我們一旦建立了一個string,在managed heap 上為他分配了一塊連續的記憶體空間,我們將不能以任何方式對這個string進行修改使之變長、變短、改變格式。所有對這個string進行各項操作而返回的string,實際上另一個重新建立的string,其本身並不會產生任何變化。
後記:
string效率怎麼樣?
string對象稱為不可變的(唯讀)對象,因為一旦建立了該對象,就不能修改該對象的值。有的時候看來似乎修改了,實際是string經過了特殊處理,每次改變值時都會建立一個新的string對象,變數會指向這個新的對象,而原來的還是指向原來的對象,所以不會改變。這也是string效率低下的原因。