摘要:List
先前在StackOverflow看到了這麼一篇文章,討論的是List<T>裡面儲存的是物件的實體還是參考位址,
如以下程式碼:
List<SomeClass> list = new List<SomeClass>();
SomeClass MyInstance = new SomeClass();
list.Add(MyInstance);
這就得探討到原本List<T>的儲存機制是使用陣列來實作,
詳情可看這篇 List capacity Tips ,
由此可知List此時儲存的是SomeClass的參考位址,
此時Poster又有一個疑問了,如下程式碼:
MyInstance = null
那此時使用List[0]可以存取的到這個物件嗎?
答案是可以的,但是若要去存取MyInstance一定會存取不到。
客官們看以下圖片應該能更清楚
如上圖片,當宣告List<T>時,它會在淺藍色區塊先創建一塊深藍色區域出來讓List使用,
當我們宣告 SomeClass MyInstance=SomeClass(); ,
此時在左邊黃色區塊會創建一個0x582 參考位址,並在右邊區塊創建一塊MyInstance實體,
而0x582則會指向這個實體,
當我們將MyInstance加入List後,同樣會有另外一個參考位址0x567同樣指向MyInstance,
因此就算使用MyInstance = null,也只是把0x582的參考位址回收而已,但是0x567仍然存在,
這也是為什麼使用List[0]仍然讀取的到的原因。