標籤: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是參考型別對象,它的對象在初始化後就不能再做修改,任何試圖修改字串的動作將導致一個新的字串對象的產生。