C#托管代码引用类型问题

时间:2011-09-22 11:01:15

标签: c#

我有一个包含一些属性的类,包括列表。这些列表可以填充一些可能相当占用内存的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也得到了更新?同时使用没有额外(或非常少)的内存并具有两个分配。

5 个答案:

答案 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>(真classinterfacedelegate)是引用类型,当您将它们传递给方法时,实际上是pointer他们传递给方法。有关详细信息,请参阅this page's部分。