剛剛看到天才少年 laneser 寫了一段程式碼,為方便說明,我稍微刪掉了一些。大致上如下:
[STAThread]
static unsafe void Main() {
string s = "123";
fixed (char* ps = s) {
ps[0] = '3';
ps[1] = '2';
ps[2] = '1';
}
MessageBox.Show("123");
}
得到的結果是這樣
呵~很有趣吧!其實原理不難,主要是因為 .NET 的 String 型別是不可變動的 (Immutable),因此為了節省記憶體的使用,CLR 會建立一個保留集區 (Intern Pool) 來存放字串。當程式中使用字串時,CLR會先檢查保留集區,有的話就傳回保留集區內的參考;沒有的話,就把字串加到保留集區內,再傳回參考。
所以上述程式碼其實是這樣執行的:
天才少年的這段程式碼實在太有趣了!
全站熱搜
留言列表