System.String是實值型別還是參考型別

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   資料   2014   

分析問題

  通過查看System.String類型的中繼資料可以看到,System.String是直接繼承自System.Object的一個子類。在前面章節中筆者已經介紹了,所有直接或間接繼承自System.ValueType的類型屬於實值型別,所以,System.String屬於參考型別而非實值型別。但是通常String的某些特性會讓程式員產生其屬於實值型別的錯覺。以下代碼展示了這些特性。

using System;namespace Test{    class StringAttribute    {        static void Main()        {            string a = "I am a string.";            string b = a;            Console.WriteLine(object.ReferenceEquals(a, b));            //嘗試使用引用b修改a指向的對象            b = "I am a new string.";            Console.WriteLine(a);            Console.WriteLine(b);            Console.WriteLine(object.ReferenceEquals(a, b));            Console.Read();        }    }}

  分析以上代碼,程式開始申明了兩個字串引用,並且使它們指向了同一個字串對象。調用object.ReferenceEquals方法可以驗證這一點。下面的程式碼檢視通過引用b來修改對象的內容:b="I am a new string.";而這一企圖卻失敗了,分別查看a和b的對象發現它們指向了不同的對象執行個體,並且,調用object.ReferenceEquals方法發現兩個引用確實不再指向同一個對象。下面是代碼的執行結果

 

   這樣的執行結果很容易給人以錯覺,誤以為String屬於實值型別。事實上,這是因為字串對象不可修改的特性所導致的。字串對象一旦被初始化後,就不能再進行任何包括刪除、切斷、插入等改動,它是一個唯讀對象,而在以上代碼中,b="I am a new string.";實際上初始化了一個新的字串對象並且賦給了b的引用,這就解釋了上面代碼的執行結果。

  由於字串的唯讀特性,任何對字串對象的修改都將強制產生一個新的字串對象。理解這一點相當重要,讀者在編寫代碼時,應該盡量避免過多無必要地產生字串的中間變數對象,這在下面的章節中會有詳細敘述。

答案

  String是參考型別對象,它的對象在初始化後就不能再做修改,任何試圖修改字串的動作將導致一個新的字串對象的產生。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.