.NET 4

2011-06-21 14 views
19

में आलसी प्रारंभिक आलसी प्रारंभिकता क्या है। खोज कोड के बाद मुझे यह कोड मिला है।.NET 4

class MessageClass 
{ 
    public string Message { get; set; } 

    public MessageClass(string message) 
    { 
     this.Message = message; 
     Console.WriteLine(" *** MessageClass constructed [{0}]", message); 
    } 
} 

Lazy<MessageClass> someInstance = new Lazy<MessageClass>(
    () => new MessageClass("The message") 
    ); 

मुझे इस तरह से वस्तु क्यों बनाना चाहिए .... वास्तव में हमें इस तरह से वस्तु बनाने की आवश्यकता है ...... उत्तर की तलाश है।

उत्तर

48

.NET 4.0 में Lazy सुविधा के उद्देश्य के एक पैटर्न में कई गुणों के साथ पहले से इस्तेमाल किया डेवलपर्स को बदलने के लिए है। "पुराने" जिस तरह की तरह

private MyClass _myProperty; 

public MyClass MyProperty 
{ 
    get 
    { 
     if (_myProperty == null) 
     { 
      _myProperty = new MyClass(); 
     } 
     return _myProperty; 
    } 
} 

कुछ इस तरह से हो सकता है, _myProperty केवल एक बार instantiated और केवल जब यह आवश्यक है हो जाता है। यदि इसकी आवश्यकता नहीं है, तो यह कभी भी तत्काल नहीं होता है। Lazy साथ एक ही बात करने के लिए, आप

private Lazy<MyClass> _myProperty = new Lazy<MyClass>(() => new MyClass()); 

public MyClass MyProperty 
{ 
    get 
    { 
     return _myProperty.Value; 
    } 
} 
बेशक

लिख सकते हैं, तो आप चीजों Lazy साथ इस तरह से करने के लिए ही सीमित नहीं हैं, लेकिन उद्देश्य कैसे वास्तव में यह जब तक ऐसा करने के बिना एक मूल्य का दृष्टांत को निर्दिष्ट करने के लिए है जरूरत है। कॉलिंग कोड को ट्रैक रखना नहीं है कि क्या मूल्य तत्काल किया गया है; बल्कि, कॉलिंग कोड केवल Value संपत्ति का उपयोग करता है। (यह पता है कि क्या मूल्य IsValueCreated संपत्ति के साथ instantiated कर दिया गया है खोजने के लिए संभव है।)

+0

जब MyProperty संपत्ति बुलाया जाएगा ... निम्न पंक्ति पर अमल करता है, तो निजी लेज़ी _myProperty = नए लेज़ी (() => नया MyClass()); संपत्ति को कैसे बुलाया जाएगा ..... मैं बस समझ में नहीं आता क्योंकि हमें हमेशा संपत्ति को स्पष्ट रूप से कॉल करने की आवश्यकता है। – Mou

+0

@ user728750 मुझे पूरा यकीन नहीं है कि मैं समझ रहा हूं कि आप क्या पूछ रहे हैं। '_myProperty' सिर्फ एक निजी उदाहरण चर है। आप इसे कक्षा के निर्माता के रूप में भी शुरू कर सकते हैं (जो वास्तव में बेहतर अभ्यास हो सकता है)। संपत्ति का उपयोग कुछ हद तक वैकल्पिक है, लेकिन यह 'वाल्यू' कॉल को हटा देता है जिसे अन्यथा आवश्यकतानुसार किया जाएगा। – Andrew

+0

मजेदार है कि यह वही चीज़ स्कैला में केवल 'आलसी वैल MyProperty = new MyClass() 'के साथ पूरा की जा सकती है। बहुत बुरा वे नेट के लिए स्कैला कंपाइलर जारी करने के लिए कभी नहीं मिला। – sparebytes

6

यहाँ पर MSDN प्रलेखन चेक आउट: Lazy Initialization

एक वस्तु का लेज़ी प्रारंभ मतलब यह है कि इसके निर्माण जब तक यह पहला प्रयोग किया जाता है आस्थगित है। आलसी प्रारंभिक रूप से मुख्य रूप से प्रदर्शन में सुधार करने, अपमानजनक गणना से बचने और प्रोग्राम मेमोरी आवश्यकताओं को कम करने के लिए उपयोग किया जाता है।

8

"लेज़ी प्रारंभ पहली बार Lazy.Value संपत्ति एक्सेस किया जाता है तब होता है या Lazy.ToString विधि कहा जाता है।

एक बड़े या संसाधन प्रधान वस्तु या के निर्माण को स्थगित करने लेज़ी का एक उदाहरण का उपयोग करें संसाधन-गहन कार्य का निष्पादन, विशेष रूप से जब इस तरह के निर्माण या निष्पादन कार्यक्रम के जीवनकाल के दौरान नहीं हो सकता है। "

http://msdn.microsoft.com/en-us/library/dd642331.aspx