一. string 類型的用法比較像值類型
稍微有點.NET 編程知識的人都知道 string是引用類型。我為什么還有此一問?因為string的使用非常像值類型。舉個例子:
string str = "abc";
Test(str);
MessageBox.Show(str);
private void Test(string str)
{
str = str + "de";
}
運行上面的代碼你會發現 str始終是abc,這就有點像值類型。因為值類型傳遞的是具體的值,所以傳入的參數是形參,函數內部修改形參,不影響外部的變量。引用類型可不是這樣,傳遞的是引用不是值。所以函數內部的修改,會影響到外部。看這個例子:
List<string> lst = new List<string>();
Test2(lst);
MessageBox.Show(lst.Count.ToString());
private void Test2(List<string> lst)
{
lst.Add("abc");
lst.Add("de");
}
或者改寫為:
private void Test2(List<string> lst1)
{
List<string> lst2 = lst1;
lst2.Add("abc");
lst2.Add("de");
}
你會發現Test2已經修改了lst,使其count數變為了2。
二.string類型是只讀的引用類型,修改string對象會創建新的實例
到底string類型是值類型還是引用類型?答案當然是引用類型。通過以下代碼即可驗證:
string str = "abc";
//1
MessageBox.Show(str.GetHashCode().ToString());
Test(str);
//4
MessageBox.Show(str.GetHashCode().ToString());
private void Test(string str)
{
//2
MessageBox.Show(str.GetHashCode().ToString());
str = str + "de";
//3
MessageBox.Show(str.GetHashCode().ToString());
}
可以看出 第一個提示框和第二個提示框的顯示的值是一樣的,說明了string傳遞的是引用,也就是指針(地址)。 第三個提示框的數值 和第二個提示框的值不一樣。為什么是這樣?
查 MSDN 可以找到 答案:
String 對象稱為不可變的(只讀),因為一旦創建了該對象,就不能修改該對象的值。看來似乎修改了 String 對象的方法實際上是返回一個包含修改內容的新 String 對象。
str = str + "de"; 由於string不可變,連接字符串操作已經創建了一個新的string對象。