2012-02-26 47 views
1

我有兩個班,一個有很多屬性,另一個有一對。我需要在較小的類中引用較大類的一些屬性,但是我想知道將值單獨傳遞是否更好。例如:當您在另一個課程中引用一個課程時,實際發送/保存了多少數據?

public class LargeClass 
{ 
    private string _var1; 
    private string _var2; 
    private string _var3; 
    //... 
    private string _var20; 
    //stuff 
} 

public class SmallClass 
{ 
    private LargeClass _largeclass; 
    private string _var1; 

    public SmallClass(LargeClass LargeClass) 
    { 
     _largeclass = LargeClass; 
     _var1 = _largeclass.Var1 + _largeclass.Var2; 
    } 
} 

或者,我可以爲小班做到這一點,並通過我需要直接值:

public class SmallClass2 
{ 
    private string _var1; 
    private string _var2; 
    private string _var3; 

    public SmallClass2(string Var1, string Var2) 
    { 
     _var1 = Var1; 
     _var2 = Var2; 
     _var3 = _var1 + _var2; 
    } 
} 

基本上,我的問題是,這些人使用了更少的空間(包括而運行時,如果序列化)?

更新:我能夠重寫我的類,以便較小的類對象引用其父對象,並發現它確實在序列化時使用較少的空間。很顯然,這個結果是個案,但我的代碼基本上將它從每個存儲文件路徑的小類的實例改爲一個字符串,以使該類能夠使用對父對象的引用即時創建路徑字符串。

由此產生的序列化數據文件減小了55%。

+1

你在這裏應該考慮的是,如果你的SmallClass應該知道'LargeClass'或者不知道這兩者有什麼關係。當你需要擔心這種微小的內存/性能差異時,情況非常罕見。 – doblak 2012-02-26 00:57:44

回答

1

他們將使用幾乎相同的內存。按引用傳遞會創建一個指向該對象的指針,因此除了指針所需的堆空間外,不會使用額外的內存。關於序列化,如果使用標準二進制序列化,選項B可能會佔用一點空間。

+1

爲什麼引用類型中的字段會在堆棧中?或者我誤解了你? – svick 2012-02-26 01:57:44

+0

@svick感謝您糾正我。 – 2012-02-26 03:05:18

2

運行時,它們將使用相同的空間量,因爲它們只是引用變量(全部指向相同的內存位置)。如果你正在序列化數據 - 那麼你將通過序列化更大的類來看到更多的開銷。

+0

謝謝。這正是我想知道的。 – Lailoken 2012-02-26 02:22:11

+0

如果您不介意,請將問題標記爲已回答。 :) – tsells 2012-02-26 13:50:00

1

在這種情況下,我不會擔心序列化空間(除非你必須序列化數千個實例)。

我會更注重類型的使用和維護。例如,如果您希望較小的類包含實例創建時的屬性值,那麼我將複製這些值。否則,我會使用對較大類型的引用。這樣,較小的類型將獲得所有字段的更改。我還會用屬性替換「_var1 + _var2」,除非「_var1」和「_var2」永不改變。

+0

序列化是我的主要關注。我正在序列化數千個實例。 「_var1 + _var2」只是一個例子。我的實際代碼有點複雜。 – Lailoken 2012-02-26 02:25:15

+1

二進制序列化處理引用,所以我肯定會使用對較大對象的引用。爲了確保你可以通過序列化100個對象到** MemoryStream **來檢查兩種情況,並檢查結果流的大小。 – Coder 2012-02-26 08:38:41

+0

查看更多關於二進制序列化在這裏: http://stackoverflow.com/questions/4905768/net-binary-serialize-object-with-references-to-other-objects-what-happens – Coder 2012-02-26 08:40:40

相關問題