string s1 = "original string";
string s2 = s1; // 注意:此時會建立新物件嗎?
Console.WriteLine(s1); // original string
Console.WriteLine(s2); // original string
s1 = "changed string";
Console.WriteLine(s1); // changed string
Console.WriteLine(s2); // original string (未受影響)
修改 s1 未影響 s2,這與一般參考型別行為 (修改物件內容會影響所有參考) 截然不同。
s1 時,在堆上建立 "original string" 物件。s2 = s1 讓 s2 參考同一個物件。s1 = "changed string" 並非修改原物件,而是在堆上建立新物件,並讓 s1 指向新物件。s2 仍指向原物件,故值不變。這是 不可變參考型別 的標準行為:任何「修改」實為「重新指派」。
string str1 = "abc";
string str2 = "abc";
Object.Equals(str1, str2) // true
按理說兩個字面常數應建立兩個物件,但因字串駐留 (見下篇) 共用同一物件,故參考相等。