【问题标题】:C# managed code reference type questionC# 托管代码引用类型问题
【发布时间】:2011-09-22 19:25:45
【问题描述】:

我有一个包含一些属性的类,由列表组成。这些列表可以填充一些可能会占用大量内存的 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 也会更新?同时不使用额外的(或很少的)内存,并且有两个任务。

【问题讨论】:

    标签: c#


    【解决方案1】:

    列表是引用类型,因此在赋值期间或将它们传递给函数时绝不复制。 XYZCacheItems 赋值后与 cb.xyzCacheItems 指向同一个对象,对 XYZCacheItems 的任何更改也会出现在 cb.xyzCacheItems 中。

    引用类型的变量,称为对象,存储对实际数据的引用。

    来自MSDN

    您可能还想阅读一些关于值类型和引用类型之间差异的文章(例如this one)。理解这一点对于高效使用 .Net 语言至关重要。

    编辑:

    不要弄乱术语。指针是指针(描述内存中特定位置的整数),引用是引用(指代特定托管对象的标识符,可以由运行时在内存中移动等等)。

    CAN 在 C# 中使用经典的类 C 指针,但它们有其缺点。

    【讨论】:

      【解决方案2】:

      当您将指针作为参数传递时,它会被复制……但对象不是。所以唯一的内存开销是指针的分配。更改从列表中拉出的对象的属性将反映在原始...除非您重新分配它。如果您重新分配列表中的指针,原始指针仍将指向旧对象。

      c#中传入的参数 --> http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

      【讨论】:

        【解决方案3】:

        其他答案很好,但我只想澄清我们所做的一个主要假设,那就是属性 wwwCacheItems 不会返回列表的副本。如果不是,那么一切都很好。

        【讨论】:

          【解决方案4】:

          如果任何对象引用指向同一个对象,则其中任何一个都将修改同一个对象。

          也就是说,虽然您不创建另一个对象,但您正在创建对同一对象的许多引用,这不会浪费内存。

          小心在很多地方引用重对象,因为如果其中一些在持久上下文中(例如单例),GAC 将永远不会回收这些对象。

          【讨论】:

            【解决方案5】:

            List&lt;T&gt;(实际上是classinterfacedelegate)是引用类型,当您将它们传递给方法时,实际上其中的pointer 传递给了方法。如需更多信息,请关注this page's 部分。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多