2013-08-02 47 views
1

可以说,我有一个真正的大对象类,它可以说是从数据库中提取数据到内存中的对象和加载数据的列表。这是为WPF应用程序。新鲜共享引用对象时分配的内存c#.net?

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

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

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

两种方案:

  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. 我可以创建类型的MyClass从VM1.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对象?

它是否像其他语言一样只存储引用,并且堆中的对象分配的内存是相同的?

+1

这就是引用的要点。您不会以任何方式复制'ReallyLargeObject',只需将两个引用存储到同一个对象。 –

+0

谢谢你想确认它是一样的:) –

回答

1

要解决这个问题,我会重构应用程序以使用小对象。在内存中没有一个真的需求过于庞大的物体和人解决这个问题的:

  • 加载这只是现在需要(只是在时间概念)的数据
  • 在服务器上执行分析和刚刚返回的结果
  • 使用分页或获得下一个项目
  • 使用流

现在针对您的具体问题:

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

不,因为无论如何你都会将两个对象存储在内存中,实际上你只需要通过创建第二个引用来进行微小的增加。你可能会加快你的应用程序的速度,但是一个经过仔细编写的软件几乎可以在大型和小型对象上运行(通过在非UI线程中运行工作)。

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

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

奖励积分:不要使用公共领域,这是不好的(单独搜索原因)

+0

雅最终我想重构这整个混乱,并创建一个更简洁快速的UI/UX的屏幕与最小的内存占用,你有建议的技术。只是想确保.NET在处理引用时不会有不同的表现。谢谢 :) –