Ho un oggetto con List<>
s esposto da proprietà. Io in genere inizializzo mie liste entro il getter proprietà come segue:Inizializzazione degli elenchi all'interno delle proprietà e nel costruttore?
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()
{
}
}
Tuttavia, i miei colleghi in genere preferiscono l'inizializzazione della lista nel costruttore della classe come segue:
public class Foo
{
public List<bar> BarList { get; set; }
public Foo()
{
BarList = new List<Bar>();
}
}
Entrambi i casi impedire BarList
da cui si accede prima è inizializzato. Il secondo sembra più pulito a causa dell'uso di autoproprietà. Tuttavia, la prima sembra un'opzione migliore, poiché l'elenco viene inizializzato solo quando viene utilizzato per la prima volta. Ci sono altre considerazioni che dovrei prendere in considerazione? C'è una buona pratica per questo?
L'importante è garantire la validità dello stato della classe. Entrambi questi approcci producono lo stesso risultato esternamente, ma internamente il '_barList' pigro-inizializzato potrebbe essere nullo mentre il costruttore inizializzato' BarList' non sarà nullo quando qualcuno tenta di usarlo all'interno della classe. Bene, esternamente il risultato non è completamente lo stesso se si inizia a introdurre comportamenti multi-thread nell'equazione. –
Si tratta di un approccio "caricamento ansioso" e "caricamento lento". –
In questo caso, è fondamentalmente una questione di stile (e opinione, però). In C# 6.0, hai un altro modo di inizializzare una proprietà auto-implementata, come [questa risposta SO] (http://stackoverflow.com/a/40754/1389444) mostra. –