msdn 中明確指出 string 是引用型別而不是值型別,但 string 表面上用起來卻像是值型別,這又是什麼原因呢?
首先從下面這個例子入手:
//值型別
int a = 1;
int b = a;
a = 2;
console.writeline("a is ,b is ", a, b);
//引用型別
string str1 = "ab";
string str2 = str1;
str1 = "abc";
console.writeline("str1 is ,str2 is ", str1, str2);
console.read();
輸出結果:
//結果:
//a is
2,b is
1 //str1 is abc,str2 is ab
從執行結果可以看出:str2 的值還是 ab ,並沒有隨著 str1 值的改變而改變。如果string是引用型別,按理str1和str指標都指向同一記憶體位址,如果str的內容發生改變,str1應該也會相應變化。此例子,看著string更像是值型別。 但是msdn卻說string是引用型別。究其原因,是因為string物件是不可變的,包括長度和其中任何字元都是不可以改變的。
string 物件稱為不可變的(唯讀),因為一旦建立了該物件,就不能修改該物件的值。有的時候看來似乎修改了,實際是string經過了特殊處理,每次改變值時都會建立乙個新的string物件,變數會指向這個新的物件,而原來的還是指向原來的物件,所以不會改變。這也是string效率低下的原因。如果經常改變string的值則應該使用stringbuilder而不使用string。
在例子中str1=」ab」,這時在記憶體中就將「ab」存下來,如果再建立字串物件,其值也等於「ab」,str2=」ab」,則並非再重新分配記憶體空間,而是將之前儲存的「ab」的位址賦給str2的引用,這就能印證例子2中的結果。而當str1=」abc」其值發生改變時,這時檢查記憶體,發現不存在此字串,則重新分配記憶體空間,儲存「abc」,並將其位址賦給str1,而str2依然指向「ab」的位址。可以印證例子中的結果。
string是引用型別,只是編譯器對其做了特殊處理。
msdn上的相關討論:
關於string是值型別還是引用型別
當然了,string本質上肯定是引用型別,但是這個特殊的類卻表現出值型別的特點 判斷相等性時,是按照內容來判斷的,而不是位址 它肯定是乙個引用型別沒錯,兩個方面來看 1.class string繼承自object,而不是system.valuetype int32這樣的則是繼承於system.val...
關於string是值型別還是引用型別
當然了,string本質上肯定是引用型別,但是這個特殊的類卻表現出值型別的特點 判斷相等性時,是按照內容來判斷的,而不是位址 它肯定是乙個引用型別沒錯,兩個方面來看 1.class string繼承自object,而不是system.valuetype int32這樣的則是繼承於system.val...
string 值型別還是引用型別
大家先來看一下下面的 吧!1using system 2using system.collections.generic 34 public class myclass5,a,s 12 1314 輸出的是abc,def 我們都知道陣列是引用型別的,請看一下段 1using system 2class...