C#托管代码引用类型问题
我有一个包含一些属性的类,由列表组成。这些列表可以填充一些相当占用内存的Sharepoint对象 我将此类及其列表属性传递给我的函数,如下所示:C#托管代码引用类型问题,c#,C#,我有一个包含一些属性的类,由列表组成。这些列表可以填充一些相当占用内存的Sharepoint对象 我将此类及其列表属性传递给我的函数,如下所示: public void InsertFixedLineItems(CacheBundle cb) { //work here } public void InsertFixedLineItems(CacheBundle cb) { List<XYZCacheItem>
public void InsertFixedLineItems(CacheBundle cb)
{
//work here
}
public void InsertFixedLineItems(CacheBundle cb)
{
List<XYZCacheItem> XYZCacheItems = cb.xyzCacheItems;
List<YYYCacheItem> YYYCacheItems = cb.YYYCacheItems;
List<ZZZCacheItem> ZZZCacheItems = cb.ZZZCacheItems;
}
正如您所看到的,所讨论的类型被称为CacheBundle,在运行时它的填充量很大
为了便于使用,我想进一步本地化确切的列表属性,如下所示:
public void InsertFixedLineItems(CacheBundle cb)
{
//work here
}
public void InsertFixedLineItems(CacheBundle cb)
{
List<XYZCacheItem> XYZCacheItems = cb.xyzCacheItems;
List<YYYCacheItem> YYYCacheItems = cb.YYYCacheItems;
List<ZZZCacheItem> ZZZCacheItems = cb.ZZZCacheItems;
}
public void InsertFixedLineItems(CacheBundle cb)
{
列出XYZCacheItems=cb.XYZCacheItems;
List YYYCacheItems=cb.YYYCacheItems;
列表ZZCacheItems=cb.ZZCacheItems;
}
我的问题是,在上面的任务中,代码创建每个属性的副本,基本上是每个集合。这样做会浪费内存吗
或者XYZCacheItems只是指向cb.XYZCacheItems的某种指针
如果不是,是否可以创建一个“指针变量”,以便在我更新XYZCacheItems->cb.XYZCacheItems时也会更新?同时不使用额外的(或很少的)内存,同时完成两个作业 列表是引用类型,因此在赋值过程中或将其传递到函数时从不复制。XYZCacheItems指向与cb.XYZCacheItems相同的对象赋值后,对XYZCacheItems的任何更改也将显示在cb.XYZCacheItems中 引用类型的变量(称为对象)存储对实际数据的引用 从 您可能还想阅读一些关于值类型和引用类型之间差异的文章(比如一篇)。理解这一点对于有效地使用.Net语言至关重要 编辑: 别把术语弄乱了。指针是指针(描述内存中特定位置的整数),引用是引用(引用特定托管对象的标识符,运行时可以在内存中四处移动,等等)
在C#中使用经典的类C指针,但它们有其缺点。当您将指针作为参数传递时,它会被复制。。。但事实并非如此。因此,唯一的内存开销是指针的分配。更改从列表中提取的对象的属性将反映在原始。。。除非你重新分配它。如果在列表中重新指定指针,原始指针仍将指向旧对象
参数传入c#-->其他答案很好,但我只想澄清我们正在做的一个主要假设,即属性wwCacheItems不返回列表的副本。如果不是,则一切正常。如果任何对象引用指向同一对象,则其中任何引用都将修改同一对象 也就是说,虽然您没有创建另一个对象,但是您正在创建对同一对象的多个引用,这并不是浪费内存 请注意在很多地方引用重对象,因为如果其中一些对象处于持久性上下文中(如单例),GAC将永远不会回收它们。
List
(实际上class
、接口
、和委托
)是引用类型,当您将它们传递给方法时,实际上,其中一个指针
传递给了方法。有关更多信息,请参见第节