2015-03-06 26 views
6

Począwszy od .NET 4, Lazy<T> może być używany do leniwie inicjowania obiektów. Intuicyjnie inicjowanie leniwy można również wykonać w obiekcie publicznym o nazwie pobierającej, aby zapewnić tę samą funkcję dla dzwoniącego. Zastanawiam się, czy Lazy<T> oferuje jakąkolwiek wrodzoną przewagę nad tym ostatnim, a zatem powinno być preferowane?Czy Lazy <T> należy preferować do leniwej inicjalizacji w geterze?

Osobiście uważam, że Lazy<> może szybko zmniejszyć czytelność kodu, ale być może właśnie widziałem to niewłaściwie. Z drugiej strony zapewnia bezpieczeństwo wątku, ale istnieje wiele konstrukcji synchronizacji .NET, które - być może jestem w błędzie - sprawiają, że łatwo jest osiągnąć to samo w geterze.

Co należy wziąć pod uwagę przy wyborze najlepszego rozwiązania?

+1

Podaj przykład leniwej inicjalizacji uzyskanej bez 'Lazy '. To nie jest takie proste, jak się wydaje. –

+1

możliwy duplikat [Właściwość podręczna kontra Lazy ] (http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt) – Default

+1

Domyślnie: nieodebrane, dzięki. To może być oznaczone jako duplikat. @Ben Voigt: podobny do tego, co opisuje Patrick Hofman w swojej odpowiedzi. Poza tym, uprzejmie proszę ludzi, którzy nie zgadzają się z tym, aby przedstawić komentarze na temat tego, jak można poprawić to pytanie (muszę powiedzieć, że jestem trochę zawiedziony tym, jak agresywna jest ta strona). – w128

Odpowiedz

7

Lazy<> może być przydatny, ponieważ zawiera obsługę wielowątkowości, coś, co trzeba zbudować samodzielnie, tworząc własne "leniwe".

Dla kodu, który nie wymaga wielowątkowości, byłby to najlepiej działający i czytelny kod według mojej opinii (przy użyciu operatora koalescencyjnego zerowego).

return variable ?? (variable = new ClassName()); 

Zauważ, że ponieważ kod ten nie jest bezpieczny wątku, może skończyć się nazywając new ClassName() wielokrotnie. W takim przypadku należy wprowadzić lock. Jeśli jest to tylko dla czytelności, Lazy<> może nie być tak źle w tym przypadku.

Ponadto, Lazy<> zapobiega używaniu pola kopii w przypadku właściwości buforowanych.

+0

Tak, to jest dokładnie to, w jaki sposób normalnie przystąpiłbym do wdrażania leniwego ładowania w pobierającym - przy użyciu operatora koalescencyjnego zerującego i pewnego rodzaju blokowania. Dla mnie nie jest to mniej czytelne niż wprowadzenie kilku wyrażeń lambda itp., Ale oczywiście jest to subiektywne i może się różnić w zależności od przypadku. W przeciwnym razie to ma sens - dziękuję! – w128

+2

@ w128 Nigdy nie używałbym "jakiegoś typu blokowania" zamiast "Lazy ", ponieważ 'Lazy ' robi to już dla ciebie. –

+0

@MatthewWatson: To był też mój argument :) –