Ho una strana abitudine sembra ... almeno secondo il mio collega. Abbiamo lavorato insieme su un piccolo progetto. Il modo in cui ho scritto le lezioni è (esempio semplificato):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Quindi, fondamentalmente, inizializzo qualsiasi campo quando viene chiamato un getter e il campo è ancora nullo. Ho pensato che questo avrebbe ridotto il sovraccarico non inizializzando nessuna proprietà che non fosse usata da nessuna parte.
ETA: Il motivo per cui l'ho fatto è che la mia classe ha diverse proprietà che restituiscono un'istanza di un'altra classe, che a sua volta ha anche proprietà con ancora più classi e così via. Chiamare il costruttore per la classe superiore significherebbe successivamente chiamare tutti i costruttori per tutte queste classi, quando non sono sempre tutte necessarie.
Vi sono obiezioni contro questa pratica, oltre alle preferenze personali?
AGGIORNAMENTO: ho preso in considerazione le diverse opinioni divergenti riguardo a questa domanda e seguirò la mia risposta accettata. Tuttavia, ora sono arrivato a una comprensione molto migliore del concetto e sono in grado di decidere quando usarlo e quando no.
Contro:
- Problemi di sicurezza del thread
- Non obbedire a una richiesta "setter" quando il valore passato è nullo
- Micro-ottimizzazioni
- La gestione delle eccezioni dovrebbe avvenire in un costruttore
- È necessario controllare il codice null in class '
Professionisti:
- Micro-ottimizzazioni
- Le proprietà non restituiscono mai null
- Ritardare o evitare di caricare oggetti "pesanti"
La maggior parte dei contro non è applicabile alla mia attuale libreria, tuttavia dovrei testare per vedere se le "micro-ottimizzazioni" stanno effettivamente ottimizzando qualcosa.
ULTIMO AGGIORNAMENTO:
Ok, ho cambiato la mia risposta. La mia domanda iniziale era se questa è una buona abitudine. E ora sono convinto che non lo sia. Forse lo userò ancora in alcune parti del mio codice attuale, ma non incondizionatamente e sicuramente non sempre. Quindi perderò la mia abitudine e ci penserò prima di usarlo. Grazie a tutti!