2015-03-06 4 views
6

.NET 4 से आगे, Lazy<T> वस्तुओं को आलसी शुरू करने के लिए उपयोग किया जा सकता है। सहजता से, आलसी प्रारंभिककरण को सार्वजनिक संपत्ति के गेटर में कॉलर को समान कार्यक्षमता प्रदान करने के लिए भी किया जा सकता है। मुझे आश्चर्य है कि Lazy<T> उत्तरार्द्ध पर किसी भी अंतर्निहित लाभ प्रदान करता है और इस प्रकार इसे प्राथमिकता दी जानी चाहिए?आलसी 0-को गेटटर में आलसी शुरुआत के लिए प्राथमिकता दी जानी चाहिए?

व्यक्तिगत रूप से, मुझे लगता है कि Lazy<> कोड पठनीयता को जल्दी से कम कर सकता है, लेकिन शायद मैंने इसे दुरुपयोग देखा है। प्लस तरफ, यह थ्रेड सुरक्षा सुनिश्चित करता है, लेकिन कई .NET सिंक्रनाइज़ेशन का निर्माण होता है - शायद मैं गलत हूं - इसे गेटटर के अंदर प्राप्त करना काफी आसान बनाता है।

सर्वोत्तम दृष्टिकोण चुनते समय जागरूक होने के कुछ विचार क्या हैं?

+1

आलसी 'के बिना प्राप्त आलसी प्रारंभिकरण का एक उदाहरण दें। ऐसा लगता है कि यह इतना आसान नहीं है। –

+1

[नकली संपत्ति बनाम आलसी ] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt) – Default

+1

डिफ़ॉल्ट: उसको याद किया, धन्यवाद। इसे डुप्लिकेट के रूप में चिह्नित किया जा सकता है। @ बेन वोगेट: पैट्रिक होफमैन ने अपने जवाब में क्या वर्णन किया है। इसके अलावा, मैं कृपया लोगों से यह पूछने के लिए कहता हूं कि इस सवाल को कैसे सुधार किया जा सकता है (यह कहना है कि मैं इस साइट को कितना आक्रामक बना रहा हूं) से निराश हूं। – w128

उत्तर

7

Lazy<> उपयोगी हो सकता है क्योंकि यह मल्टीथ्रेडिंग के लिए भी समर्थन प्रदान करता है, जो आपको अपना खुद का 'आलसी' बनाते समय स्वयं को बनाना है।

कोड के लिए जो बहु-थ्रेडिंग की आवश्यकता नहीं है, यह मेरी राय में सबसे अच्छा प्रदर्शन करने योग्य और पठनीय कोड होगा (नल-कोलेसिंग ऑपरेटर का उपयोग करके)।

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

ध्यान दें कि जब से इस कोड को सुरक्षित थ्रेड नहीं है, आपको बुला रहा new ClassName() कई बार लग सकती है।

आपको lock आईएनजी शुरू करना चाहिए, और पठनीयता कम हो जाएगी। अगर यह केवल पठनीयता के लिए है, तो Lazy<> उस मामले में बुरा नहीं हो सकता है।

इसके अलावा, Lazy<> आपको कैश किए गए गुणों के मामले में बैकिंग फ़ील्ड का उपयोग करने से रोकता है।

+0

हां, यह ठीक है कि मैं सामान्य रूप से एक गेटर में आलसी लोडिंग को लागू करने के लिए आगे बढ़ता हूं - नल-कोलेसिंग ऑपरेटर और कुछ प्रकार के लॉकिंग का उपयोग करके। मेरे लिए यह लैम्ब्डा अभिव्यक्तियों का एक समूह शुरू करने से कम पढ़ने योग्य प्रतीत नहीं होता है, लेकिन निश्चित रूप से यह व्यक्तिपरक है और मामले-दर-मामले बदल सकता है। अन्यथा, यह सही समझ में आता है - धन्यवाद! – w128

+2

@ w128 'Lazy ' का उपयोग करने के बजाय मैं कभी भी "कुछ प्रकार की लॉकिंग" का उपयोग नहीं करता, क्योंकि 'आलसी ' पहले से ही आपके लिए यह सब कुछ करता है। –

+0

@ मैथ्यू वाटसन: यह मेरा तर्क भी था :) –

संबंधित मुद्दे