出於好奇,如果我叫:字符串賦值會像這樣調用String構造函數嗎?
string txt = "text";
將它稱之爲,在幕後?
string txt = new String("text".ToCharArray())?
出於好奇,如果我叫:字符串賦值會像這樣調用String構造函數嗎?
string txt = "text";
將它稱之爲,在幕後?
string txt = new String("text".ToCharArray())?
不,它不會。該代碼將直接轉換爲IL stloc
命令。它將基本上編譯爲以下內容
ldstr "text"
stloc.0
我對此表示懷疑 - 爲什麼會
但是,爲什麼不找自己,運行ILDASM,看看代碼從intern pool並將其存儲產生
string txt1 = "text";
負載串"text"
作爲參考txt1
變量。
因此,舉例來說,如果你有
string txt2 = "text";
string txt3 = "text";
然後ReferenceEquals(txt2, txt3) == true
,因爲這兩個變量引用同一個字符串對象在池中實習生。
String Constructor創建一個新的非實體字符串對象。
string txt4 = new String("text".ToCharArray());
因此ReferenceEquals(txt1, txt4) == false
。
有一個例外:new String(new char[0])
返回對內部池中""
字符串對象的引用。