2015-07-20 110 views
5

我有一個對象List<>由屬性暴露。我一般初始化屬性getter內我的名單如下:在構造函數中初始化屬性內的列表?

public class Foo 
{ 
    private List<bar> _barList; 

    public List<bar> 
    { 
     get 
     { 
      if(_barList == null) 
      { 
       _barList = new List<Bar>() 
      } 

      return _barList; 
     } 

     set 
     { 
      _barList = value; 
     } 
    } 

    public Foo() 
    { 
    } 
} 

然而,我的同事們一般喜歡在類的構造函數初始化列表如下:

public class Foo 
{ 
    public List<bar> BarList { get; set; } 

    public Foo() 
    { 
     BarList = new List<Bar>(); 
    } 
} 

兩種情況防止BarList從之前被訪問它被初始化。由於使用自動屬性,第二個看起來更加整齊。第一個看起來好像是一個更好的選擇,因爲這個列表只在第一次使用時才被初始化。我應該考慮其他因素嗎?對此有最佳做法嗎?

+2

重要的是確保你班級的狀態有效。這兩種方法在外部產生相同的結果,但在內部,您的惰性初始化'_barList'可能爲null,而當有人試圖在類中使用時,構造函數初始化'BarList'不會爲null。那麼,如果你開始在方程中引入多線程行爲,外部結果並不完全相同。 –

+1

這真的是「急切加載」與「懶加載」方法。 –

+1

在這種情況下,它基本上是一種風格(和意見,雖然)的問題。在c#6.0中,你有另一種初始化自動實現的屬性的方法,正如[這個SO回答](http://stackoverflow.com/a/40754/1389444)所示。 –

回答

4

如果需要節約內存,懶惰策略顯然會更好。如果這種內存使用不重要,那麼渴望的策略會產生更簡單的代碼。這是最好的。

總的來說,消除特殊情況是件好事。對於內部訪問,列表字段可以爲空並不是一件好事。

請注意,隨着C#6將代碼更傾向於更短的代碼解決方案,代碼變得更短。

請注意,惰性版本對於併發執行getter而言不是線程安全的。

3

除了usrs答案之外,在這個問題上還有一個使用C#6.0的答案。

其中一項新功能是自動實現屬性的初始值設定項。你會寫:

public class Foo 
{ 
    public List<bar> BarList { get; set; } = new List<bar>(); 
} 

而且,看看在新的主構造,發現a programmers.stackexchange article

此初始化器將在對象初始化時調用。在內存消耗/性能方面,它應該等同於在構造函數中初始化屬性。

+0

使用此功能時,是在初始化類時初始化的列表,還是C#爲您處理「懶惰」初始化?如果是這樣,這似乎是迄今爲止最好的解決方案! – Ivan

+0

類初始化時(靜態構造函數)是不可能的,因爲屬性是實例成員,所以它必須是對象初始化時間。 –

+0

哎呀,我的意思是說對象,而不是課堂。所以這個功能看起來等同於OP ..中的第二個選項。因爲在我的情況下,列表有時不會使用,我想知道如果節省內存可能會使它值得自己寫出來。 – Ivan

相關問題