Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#托管代码引用类型问题_C# - Fatal编程技术网

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

C#托管代码引用类型问题,c#,C#,我有一个包含一些属性的类,由列表组成。这些列表可以填充一些相当占用内存的Sharepoint对象 我将此类及其列表属性传递给我的函数,如下所示: public void InsertFixedLineItems(CacheBundle cb) { //work here } public void InsertFixedLineItems(CacheBundle cb) { List<XYZCacheItem>

我有一个包含一些属性的类,由列表组成。这些列表可以填充一些相当占用内存的Sharepoint对象

我将此类及其列表属性传递给我的函数,如下所示:

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
接口
、和
委托
)是引用类型,当您将它们传递给方法时,实际上,其中一个
指针
传递给了方法。有关更多信息,请参见第节