c#托管代码参考类型问题
本文关键字:问题 类型 参考 托管代码 | 更新日期: 2023-09-27 18:09:33
我有一个包含一些属性的类,由列表组成。这些列表可以用一些占用大量内存的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得到更新了吗?同时,不使用额外的(或很少的)内存,并且有两个赋值。
列表是引用类型,因此永远不会在赋值或传递给函数时复制。XYZCacheItems指向与cb相同的对象。xyzCacheItems赋值后,对xyzCacheItems的任何更改都会出现在cb中。xyzCacheItems
从MSDN。引用类型的变量,称为对象,存储对实际数据的引用。
您可能还想阅读一些关于值类型和引用类型之间差异的文章(如本文)。理解这一点对于有效地使用。net语言至关重要。
编辑:不要混淆术语。指针是指针(描述内存中特定位置的整数),引用是引用(引用特定管理对象的标识符,可以通过运行时在内存中移动,以及其他事项)。
你可以在c#中使用经典的类C指针,但是它们也有缺点。
指针作为参数传递时被复制…但对象不是。所以唯一的内存开销是分配指针。更改从列表中拉出的对象的属性将反映在原始的…除非你重新分配。如果在列表中重新分配指针,原始指针仍将指向旧对象。
c#中的参数传递--> http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx
其他答案都很好,但我只是想澄清我们正在做的一个主要假设,那就是属性wwwCacheItems不返回列表的副本。如果不是,则一切正常。
如果任何一个对象引用都指向同一个对象,则其中任何一个引用都将修改同一个对象。
也就是说,虽然您没有创建另一个对象,但您创建了对同一对象的许多引用,这不会浪费内存。
要小心在很多地方引用重对象,因为如果其中一些是在持久上下文中(如单例),它们将永远不会被GAC回收。
List<T>
(实际上是class
, interface
和delegate
)是引用类型,当您将它们传递给方法时,实际上它们中的pointer
传递给了方法。