2011-09-22 35 views
3

我有一個類包含一些屬性,包含列表。這些列表可以填充一些可能相當佔用內存的Sharepoint對象。C#託管代碼引用類型問題

我通過通過這個類的列表屬性,以我的功能是這樣的:

public void InsertFixedLineItems(CacheBundle cb) 
     { 
//work here 
     } 

正如你所看到的問題的類型稱爲CacheBundle,並在運行時它的人口稠密。

爲了方便使用我想進一步這樣定位的準確列表屬性:

public void InsertFixedLineItems(CacheBundle cb) 
     { 
      List<XYZCacheItem> XYZCacheItems = cb.xyzCacheItems; 
      List<YYYCacheItem> YYYCacheItems = cb.YYYCacheItems; 
      List<ZZZCacheItem> ZZZCacheItems = cb.ZZZCacheItems; 
     } 

我的問題是,這種分配期間以上爲創造每個屬性的副本,基本上每個集合的代碼。這樣做會浪費內存?

或者是XYZCacheItems只是某種類型的指向cb.xyzCacheItems的指針。

如果不是,是否可以創建一個「指針變量」,這樣如果我更新XYZCacheItems - > cb.xyzCacheItems也會被更新?同時不使用額外的(或很少的)內存,並且有兩個任務。

回答

4

列表是參考類型,因此是從不在在分配過程中或在將它們傳遞給函數時複製。 XYZCacheItems在賦值後指向與cb.xyzCacheItems相同的對象,對XYZCacheItems的任何更改也會出現在cb.xyzCacheItems中。

引用類型的變量(稱爲對象)存儲對實際數據的引用。

MSDN

您可能還想閱讀一些關於價值和參考類型之間差異的文章(如this之一)。理解這一點對於有效使用.Net語言至關重要。

編輯:

不要弄糊塗末尾。指針是指針(整數描述內存中的特定位置),引用是引用(標識符指的是特定的被管理對象,除了別的以外,它可以在運行時在內存中移動)。

CAN在C#中使用經典的類C指針,但它們有它們的缺點。

3

當您將它作爲參數傳遞時,指針被複制......但對象不是。所以唯一的內存開銷是指針的分配。更改從列表中拉出的對象的屬性將反映在原始內容中......除非您重新分配它。如果您重新分配列表中的指針,則原始指針仍將指向舊對象。

參數傳遞在C# - >http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

1

其他的答案是好的,但我只是想弄清楚我們正在做的主要假設,那就是財產wwwCacheItems不返回副本列表。如果不是,那麼一切都很好。

1

如果任何對象引用指向同一個對象,任何這些將修改同一對象。

這就是,當你不創建另一個對象,你正在創建相同的對象,這不是浪費內存許多引用。

要小心具有在很多地方被引用重物,因爲如果其中一些是在持續的背景下 - 像單身 - 這些將永遠不會被GAC回收。

1

List<T>(真classinterfacedelegate)是引用類型,當你將它們傳遞到一個方法,其實他們的pointer傳遞給方法。欲瞭解更多信息,請點擊this page's部分。