मैं तरीके आलसी प्रारंभ करने के लिए की तलाश में और Lazy<T>
जो .NET में शामिल किया गया है पाया गया था 4.लेज़ी <T> कार्यान्वयन और .NET जेनरिक
मैं .NET 3.5 के लिए Lazy<T>
के अपने खुद के कार्यान्वयन रोलिंग की सोच रहा था (साथ
लेज़ी निर्माताओं की मूल रूप से दो प्रकार के होते हैं:: एक सरल बहु धागा नीति), और मैं निम्नलिखित समस्या से टकरा
class Lazy<T> {
public Lazy(){...} // ctor #1
जो एक बनाने के लिए टी के डिफ़ॉल्ट निर्माता का उपयोग करता है एन का उदाहरण, और
public Lazy(Func<T> func){...} // ctor #2
जो कॉलर को यह तय करने देता है कि टी का उदाहरण कैसे बनाया गया है।
अब यहाँ समस्या है:
मैं संकलन समय 1 ctor के लिए जाँच मैं श्रेणी स्तर पर एक प्रतिबंध
class Lazy<T> where T: new() {...}
जोड़ना होगा चाहते हैं। यह मुझे उदाहरण बनाने के लिए new T()
का उपयोग करने की अनुमति देगा; लेकिन यह प्रतिबंध दूसरे ctor के लिए जरूरी नहीं है, और इससे भी बदतर, यह उन प्रकारों को प्रतिबंधित करता है जिन्हें मैं उपयोग कर सकता हूं (डिफ़ॉल्ट ctor वाले लोगों के लिए)
यदि मैं दूसरे ctor के साथ किसी भी प्रकार का उपयोग करने में सक्षम होना चाहता हूं, तो मैं कोई प्रतिबंध नहीं लगाएगा, और पहले सीटीआर में T
में एक डिफ़ॉल्ट सीटीआर सुनिश्चित करने के लिए प्रतिबिंब का उपयोग करेगा। हालांकि, इस दृष्टिकोण में संकलन-समय की जांच की कमी होगी, और अगर पहले ctor को गलत प्रकार के साथ प्रयोग किया जाता है तो केवल रनटाइम अपवाद फेंक देगा।
मेरा सवाल है: क्या मैं दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकता हूं?
आदर्श रूप से, मैं ctor # 1 के प्रत्येक उपयोग के लिए संकलन-समय की जांच प्राप्त करना चाहता हूं, लेकिन साथ ही उन प्रकारों के लिए ctor # 2 का उपयोग करने में सक्षम होना चाहिए जिनके पास डिफ़ॉल्ट ctor नहीं है।
माइक्रोसॉफ्ट कार्यान्वयन यह कैसे करता है? (मुझे आसानी से .NET 4 स्रोतों या डीएलएस तक पहुंच नहीं है)।
संपादित करें:
("परावर्तक-इंग" एमएस विधानसभा के बाद) मैं संदर्भ कार्यान्वयन की जाँच की और यह संकलन-समय जांचें करता नहीं करता है।
यह 'डिफ़ॉल्ट सीटीओआर' मामले के प्रति प्रतिबिंब का उपयोग करता है, निश्चित रूप से रनटाइम अपवाद के साथ यदि चीजें खराब होती हैं।
आप .NET 4 कार्यान्वयन –
@ थॉमस को देखने के लिए परावर्तक का उपयोग कर सकते हैं। मुझे खुद को उद्धृत करना पसंद है। मुझे महत्वपूर्ण लगता है: "मुझे आसानी से .NET 4 स्रोतों या डीएलएस तक पहुंच नहीं है" ... या कम से कम यह सच था जब मैंने सवाल पूछा। इस बीच, लुकास के संकेत के लिए धन्यवाद, मुझे असेंबली का पकड़ मिला और मेरे निष्कर्षों के साथ सवाल को अद्यतन किया। –
ठीक है, मैंने "या dlls" भाग को याद किया ... क्षमा करें –