2013-08-02 80 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在處理引用時不會有不同的表現。謝謝 :) –