Wydaje mi się, że mam dziwny zwyczaj ... przynajmniej według mojego współpracownika. Pracowaliśmy razem nad małym projektem. Sposób, w jaki napisałem zajęcia to (przykład uproszczony):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Zasadniczo więc inicjalizuję dowolne pole tylko wtedy, gdy wywoływana jest metoda pobierająca, a pole jest nadal puste. Pomyślałem, że to zmniejszyłoby przeciążenie, nie inicjując żadnych właściwości, które nie są nigdzie używane.
ETA: Zrobiłem to, ponieważ moja klasa ma kilka właściwości, które zwracają instancję innej klasy, która z kolei ma również właściwości z jeszcze większą liczbą klas i tak dalej. Wywołanie konstruktora dla najwyższej klasy spowodowałoby następnie wywołanie wszystkich konstruktorów dla wszystkich tych klas, gdy nie zawsze są one potrzebne.
Czy są jakieś zastrzeżenia wobec tej praktyki, inne niż osobiste preferencje?
AKTUALIZACJA: Rozważyłem wiele różnych opinii w odniesieniu do tego pytania i podtrzymam moją zaakceptowaną odpowiedź. Jednak teraz znacznie lepiej zrozumiałem koncepcję i jestem w stanie zdecydować, kiedy go użyć, a kiedy nie.
Cons:
- Problemy z bezpieczeństwem wątków
- Nieprzestrzeganie żądania „ustawiającego”, gdy przekazana wartość jest pusta
- Mikrooptymalizacje
- Obsługa wyjątków powinna odbywać się w konstruktorze
- Musisz sprawdzić, czy w kodzie klasy nie ma null
Plusy:
- Mikrooptymalizacje
- Właściwości nigdy nie zwracają wartości null
- Opóźnij lub unikaj ładowania „ciężkich” przedmiotów
Większość wad nie ma zastosowania w mojej obecnej bibliotece, jednak musiałbym sprawdzić, czy „mikro-optymalizacje” w ogóle coś optymalizują.
OSTATNIA AKTUALIZACJA:
Okej, zmieniłem odpowiedź. Moje pierwotne pytanie dotyczyło tego, czy jest to dobry nawyk. Jestem teraz przekonany, że tak nie jest. Może nadal będę go używać w niektórych częściach mojego obecnego kodu, ale nie bezwarunkowo i zdecydowanie nie cały czas. Więc stracę nawyk i pomyślę o tym przed użyciem. Dziękuję wszystkim!