2011-03-18 15 views
23

ए) निम्नलिखित कोड में, विधि DataTools.LoadSearchList() केवल एक बार कॉल की जाएगी, या हर बार संपत्ति का उपयोग किया जा रहा है?स्थैतिक संपत्ति प्रारंभिकरण

public static IEnumerable<string> SearchWordList 
{ 
    get 
    { 
     return DataTools.LoadSearchList(); 
    } 
} 

बी) क्या इसमें कोई अंतर है?

public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList(); 
+4

गुण और फ़ील्ड पूरी तरह अलग तरीके से व्यवहार करते हैं, भले ही वे कोडिंग बिंदु से समान दिखाई दे सकें। एक संपत्ति वास्तव में प्राप्त/सेट विधियों की एक जोड़ी के लिए एक शॉर्टकट है, और किसी भी विधि की तरह, प्रत्येक बार जब आप इसे कॉल करते हैं तो शरीर को निष्पादित किया जाएगा .. – MattDavey

उत्तर

29

आपके पहले उदाहरण में, लोडशर्चलिस्ट() को प्रत्येक बार संपत्ति का उपयोग करने के लिए बुलाया जाएगा।

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

एक बेहतर विकल्प हो सकता है:

private static IEnumerable<string> _searchWordList; 

public static IEnumerable<string> SearchWordList 
{ 
    get 
    { 
     return _searchWordList ?? 
      (_searchWordList = DataTools.LoadSearchList()); 
    } 
} 

या आप .NET 4.0 उपयोग कर रहे हैं और कुछ धागे की सुरक्षित आप Lazy<T> उपयोग कर सकते हैं चाहते हैं, के रूप में जॉन स्कीट उल्लेख किया (मुझे लगता है कि वाक्य रचना सही होना चाहिए, लेकिन मुझे इसे पकड़ न दें):

private static Lazy<IEnumerable<string>> _searchWordList = 
    new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList()); 

public static IEnumerable<string> SearchWordList 
{ 
    get { return _searchWordList.Value; } 
} 
+3

ध्यान दें कि यदि एकाधिक हैं तो इसे * एक से अधिक बार बुलाया जा सकता है धागे शामिल हैं। व्यक्तिगत रूप से मैं .NET 4 से 'Lazy ' का उपयोग करना पसंद करूंगा, अगर यह एक विकल्प है। फिर उदाहरण के लिए, दूसरा समवर्ती कॉलर ब्लॉक बनाने के लिए इस तरह की चीज़ को समायोजित करना आसान है। –

+0

@ जोन स्कीट - एक उदाहरण के साथ अपडेट किया गया ... उम्मीद है कि मुझे सिंटैक्स सही मिला है। –

+2

मेरे लिए अच्छा लग रहा है, हालांकि मैं * सोचता हूं * आप विधि समूह रूपांतरण का उपयोग करने के लिए शायद 'नया आलसी > (DataTools.LoadSearchList)' कर सकते हैं। –

12

पहले मामले में जब भी संपत्ति का उपयोग किया जाता है तो विधि को बुलाया जाएगा। जब इसे एक फ़ील्ड के रूप में सेट किया जाता है, तो यह ठीक उसी समय चलाया जाएगा - जब इसे प्रारंभ किया गया प्रकार - चाहे वह कभी एक्सेस किया गया हो।

आप एक lazily-प्रारंभ मूल्य चाहते हैं, मैं नेट से Lazy<T> की सलाह देते हैं 4.

2

हाँ, संपत्ति DataTools.LoadSearchList() हर बार पहुँच कॉल करेंगे। स्थैतिक क्षेत्र केवल एक बार विधि को कॉल करेगा।

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