首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# string 類型賦值問題 (1) — 參考型別卻表現像值型別

     編輯:關於C語言

現象


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,這與一般參考型別行為 (修改物件內容會影響所有參考) 截然不同。

原因:String 為不可變型別

  • 初始化 s1 時,在堆上建立 "original string" 物件。
  • s2 = s1 讓 s2 參考同一個物件。
  • s1 = "changed string" 並非修改原物件,而是在堆上建立新物件,並讓 s1 指向新物件。
  • s2 仍指向原物件,故值不變。

這是 不可變參考型別 的標準行為:任何「修改」實為「重新指派」。

字面常數的特殊行為


string str1 = "abc";
string str2 = "abc";
Object.Equals(str1, str2) // true

按理說兩個字面常數應建立兩個物件,但因字串駐留 (見下篇) 共用同一物件,故參考相等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved