2013-10-29 268 views
1

我有一個複雜的c#類,它有幾個扁平成員和幾個嵌套的複雜類型。初始化「嵌套」對象

作爲一般慣例,如果沒有數據,我不會初始化「嵌套」複雜類型。

舉例來說,如果我有一個類

Public class Person 
{ 
public string FirstName{get;set;} 
public Address{get;set;} 
} 

我不會做Person p = new Person(){FirstName="Test", Address = new Address()};

然而,有人告訴我初始化「的所有子」複雜的類型,即使在我看來,這應該不是情況。爲什麼在我們沒有數據時分配內存。你如何決定對象是否爲空。你比較所有值/定義某種滯後,或定義一個專門的子類來表示空的實例。

您的反饋將不勝感激。

+2

也許你canuse NullObjectpattern:http://en.wikipedia.org/wiki/Null_Object_pattern – JleruOHeP

+0

見http://www.infoq.com/presentations/Null-參考文獻 - 十億美元 - 錯誤 - 託尼 - 霍爾和http://c2.com/cgi/wiki?PrematureOptimization,你的直覺認爲你不應該保留你不需要的空間可能屬於早熟類別優化,並且副作用將導致代碼*更多*更可能引入空引用異常。 –

回答

1

運行時成本檢查每個屬性null之前訪問可能比初始化所有字段與「空」對象(見Null Object pattern)。 「空」/「空對象」的內存開銷可能非常小,因爲您可以簡單地在所有對象上共享單個只讀實例。

此外,如果您保留某些對象的某些部分未初始化,則在訪問/使用對象之前,如果需要執行null檢查,則開發人員需要花費很高的開銷才能查找。

基本上,您可能會獲得一些優惠,但不需要初始化某些字段,但您需要花費大量時間來確保訪問屬性的所有權限都得到了適當的保護,以防止訪問null字段。

0

爲了保持簡單,你可以在構造函數中初始化:

public class Person 
{ 
    public Person() 
    { 
     this.Address = new Address(); 
    } 
    public string FirstName {get; set;} 
    public Address {get; set;} 
} 

// Don´t need to do Person p = new Person(){ FirstName="Test", Address = new Address()}; 
Person p = new Person(); 

不必擔心,除非你有數以百萬計的物體,或者你知道你會擁有。

0

您可以使用此模式:

Public class Person 
{ 
    private Address address; 

    public Address Address 
    { 
    get 
    { 
     return address ?? (address = new Address()); 
    } 
    } 
} 
+0

問題是我有一些基於子類型爲「空」或「不」的邏輯。例如,如果地址爲空,我可以讓用戶在屏幕上輸入它,否則只顯示它是隻讀的。那麼我們是否說'初始化'子類型更好?如果用戶開始調用它的方法會怎麼樣。這不會導致不可預知的行爲?至少,如果對象爲空,我會一直得到「空引用異常」。 –