我知道字符串是C#中不可變的引用類型。但我有一個更具體的問題。修改字符串
string a = "hello ";
string b = a;
a += "world";
Console.WriteLine(b);
上面的代碼將產生輸出hello
。我意識到這是因爲字符串是不可變的,所以一旦我們創建了一個值爲「hello」的字符串實例,它就不能被修改。但我想知道,當我們做a += "world"
會發生什麼?縱觀IL似乎並沒有給我的原委不幸的是(或者它可能是我太新手看到更大的畫面)
IL_0001: ldstr "hello "
IL_0006: stloc.0 // a
IL_0007: ldloc.0 // a
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: ldstr "world"
IL_000F: call System.String.Concat
IL_0014: stloc.0 // a
IL_0015: ldloc.0 // a
IL_0016: call System.Console.WriteLine
的IL展現給我什麼,我就已經猜到了字符串「hello」與「world」連接成一個新的字符串。但是,這是否意味着這行實際上完成的是:
- 創建具有價值的「世界」的字符串對象的新實例。
- 讀取我們的第一個字符串對象「hello」的值,然後將該值與「world」連接以形成第三個字符串。
- 將上述字符串的引用返回到
a
。 - 「世界」字符串實例現在孤立並標記爲收集?
還是我完全錯了?我真的想知道「幕後」會發生什麼事情,或者說..
不,你根本沒有錯。你基本上自己回答你的問題。這正是發生的情況。 –