List<T>儲存的是object or reference

  • 1622
  • 0
  • C#
  • 2013-06-15

摘要:List儲存的是object or reference

先前在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]仍然讀取的到的原因。