2013-04-24 43 views
1

當一個對象擁有另一個對象作爲一個屬性,並且該屬性默認爲空。如果它的屬性被代碼訪問,該屬性是否會被初始化?如果我訪問那些對象屬性,是否有一個類屬性自動初始化?

public User { 
    private _obj = null; 
    public Obj SomeObject { 
     get { return _obj ?? (_obj = new Obj()); } 
     set { _obj = value; } 
    } 

    public User() { 
     //do stuff 
    } 
} 

正在使用的代碼。

User user = new User(); 

int x = user.SomeObject.SomeIntValue; 

如果它是空的,這會啓動SomeObject的新版本嗎?編輯 - 應用@Kjartan建議代碼

回答

3

這確實會起作用。該屬性第一次被訪問時,_obj將被填充新的實例(因爲之前爲空)。接下來的調用,您將返回第一次初始化的相同Obj實例。

這是創建某種「延遲加載」的常用方法。

+1

這裏還有一個延遲初始化[MSDN(HTTP類:// msdn.microsoft.com/en-us/library/dd642331.aspx) – mgttlinger 2013-04-24 14:36:04

+0

非常感謝您的確認:D – Jessycormier 2013-04-24 14:36:55

2

應該工作。與此

get { 
     if(_obj == null) 
      _obj = new Obj(); 
     return _obj; 
} 

...:而作爲一個側面說明,只是爲了簡便起見,你可以取代這個

get { return _obj ?? (_obj = new Obj()); }