string 是值類型,還是引用類型(.net)


一. 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對象。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM