【问题标题】:fresh Memory allocated when sharing reference to object c# .net?共享对对象 c#.net 的引用时分配的新内存?
【发布时间】:2013-08-03 14:34:34
【问题描述】:

假设我有一个包含一个非常大的对象的类,可以说是一个对象列表,并通过从数据库中获取数据加载到内存中。这是针对 WPF 应用程序的。

public class MyClass {
         public ReallyLargeObject largeObject;
         //Other properties.
    }

我有一个视图模型 (VM1) 对象,它具有将此类绑定到 XAML 的引用。

我需要另一个视图模型 (VM2),它只有 MyClass 的某些属性,而不是 largeObject。

两种情况:

  1. 我可以分配 VM2.myClass = VM1.myClass

    var viewModel1 = new VM1() {
         myClass = new MyClass() {
            largeObject = new ReallyLargeObject();
            //initialize other properties
         }
    };
    
    var viewModel2 = new VM2() {
         myClass = viewModel1.myClass
    };
    
  2. 我可以从 VM1.myClass 创建一个 MyClass 类型的新对象,但这次设置 largeObject = null

    var viewModel1 = new VM1() {
        myClass = new MyClass() {
            largeObject = new ReallyLargeObject();
            //initialize other properties
        }
    };
    
    var viewModel2 = new VM2(){
        myClass = new MyClass(){
           //initialize other properties
        }
    };
    

两个视图模型在运行时都会在内存中相当长的一段时间。

我遇到了第一种方法占用大量内存且屏幕速度相当慢的问题。

从原始对象创建一个更苗条的对象会减少使用的内存吗?

我很困惑,因为从技术上讲,视图模型 2 仅引用了视图模型 1 中的对象。

在两个包装对象中存储对同一对象的引用时,.NET 的行为如何?

它是否像其他语言一样单独存储引用并且在堆上分配给对象的内存相同?

【问题讨论】:

  • 这就是整个参考点。无论哪种方式,您都不会复制ReallyLargeObject,您只需存储对同一对象的两个引用。
  • 谢谢你想确认它是一样的:)

标签: c# .net object memory reference


【解决方案1】:

为了解决这个问题,我将重构应用程序以使用小对象。没有人真的需要内存中的超大对象,人们可以通过以下方式解决这个问题:

  • 仅加载刚刚需要的数据(及时概念)
  • 在服务器上执行分析并返回结果
  • 使用分页或获取下一项
  • 使用流

现在关于您的具体问题:

从原始对象创建一个更苗条的对象会减少使用的内存吗?

不,因为无论如何您都会将两个对象都存储在内存中,实际上您只需通过创建第二个引用来稍微增加一点。您可能会加快应用程序的速度,但精心编写的软件几乎可以同等地处理大小对象(通过在非 UI 线程中运行工作)。

在两个包装对象中存储对同一对象的引用时,.NET 的行为如何?

在您的情况下,.NET 仅存储引用,简而言之,这些引用只是数字 - 指向对象本身的指针(尽管有 some differences)。因此,当您更改单个对象时,所有引用者都会看到此更改,因为他们只是 指向 到该对象。

加分项:不要使用公共字段,那太糟糕了(单独搜索原因)

【讨论】:

  • 是的,最终我想重构这整个混乱,并使用您建议的技术为屏幕创建一个更精简、更快的 UI/UX,同时占用最少的内存。只是想确保 .NET 在处理引用时没有不同的行为。谢谢:)
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多