我有一个包含一些属性的类,包括列表。这些列表可以填充一些可能相当占用内存的Sharepoint对象。
我将这个列的属性传递给我的函数,如下所示:
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也得到了更新?同时使用没有额外(或非常少)的内存并具有两个分配。
答案 0 :(得分:4)
列表是引用类型,因此在赋值期间或将它们传递给函数时从不复制。在赋值后,XYZCacheItems指向与cb.xyzCacheItems相同的对象,对XYZCacheItems的任何更改也将出现在cb.xyzCacheItems中。
引用类型的变量(称为对象)存储对实际数据的引用。
来自MSDN。
您可能还想阅读一些有关值和引用类型之间差异的文章(如this之一)。了解这一点对于有效使用.Net语言至关重要。
编辑:
不要弄乱终点词。指针是指针(描述内存中特定位置的整数),引用是引用(引用特定管理对象的标识符,可以由运行时在内存中移动)等。
你CAN在C#中使用经典的类C指针,但它们有它们的缺点。
答案 1 :(得分:3)
将指针作为参数传递时复制指针...但对象不是。所以唯一的内存开销是指针的分配。更改从列表中提取的对象的属性将反映在原始...除非您重新分配它。如果重新指定列表中的指针,原始指针仍将指向旧对象。
c#中的参数传递 - &gt; http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx
答案 2 :(得分:1)
其他答案都很好,但我只想澄清一个我们正在做的主要假设,那就是属性wwwCacheItems不会返回列表的副本。如果不是,那一切都很好。
答案 3 :(得分:1)
如果任何对象引用指向同一个对象,则其中任何一个都将修改同一个对象。
那就是,虽然你没有创建另一个对象,但是你创建了许多对同一个对象的引用,这不会浪费你的内存。
要注意在很多地方引用重物,因为如果其中一些物体处于持久性环境中 - 比如单身物 - 那么GAC永远不会回收这些物体。
答案 4 :(得分:1)
List<T>
(真class
,interface
和delegate
)是引用类型,当您将它们传递给方法时,实际上是pointer
他们传递给方法。有关详细信息,请参阅this page's部分。