मैं इस बारे में सोच रहा था। कक्षाएं स्पष्ट रूप से पीटीआर द्वारा पारित की जाती हैं। मुझे संदेह है कि इसे कॉपी करके स्ट्रक्चर पास किए जाते हैं लेकिन मुझे निश्चित रूप से पता नहीं है। (ऐसा लगता है कि एक int सरणी के लिए प्रत्येक तत्व एक पीआरटी है और इनट्स के लिए पासिंग पीआरटी है)

लेकिन इसके बारे में सोचकर, List<MyStruct> मेरी संरचना का आकार नहीं जान सकता। जब मैं ऐसा करता हूं तो क्या होता है? क्या "सूची`1" की कई प्रतियां हैं और हर बार जब मैं इसे भंडारण आकार के साथ उपयोग करता हूं तो यह एक नया कार्यान्वयन नहीं करता है? (टी और इस तरह के नए ऑफसेट के लिए समायोजन)।

यह समझ में आता है क्योंकि स्रोत डीएलएल के अंदर सीआईएल में होगा। लेकिन मैं पूरी तरह से अनुमान लगा रहा हूं, यह कैसे किया जाता है? शायद ईसीएमए मानकों के लिए एक संदर्भ या पेज #?

6
user34537 22 जून 2011, 00:53
मैं इस बारे में बहुत कम जानता हूं कि सी # जेनरिक कैसे लागू करता है। लेकिन संदर्भ के लिए, ठीक इसी तरह C++ टेम्प्लेट काम करते हैं (सिद्धांत रूप में, प्रत्येक प्रकार के लिए List का एक अलग कार्यान्वयन तत्काल किया जाएगा)।
 – 
Oliver Charlesworth
22 जून 2011, 00:57
@ ओली: हाँ, मुझे यह भी पता है कि जब तक आप इसका उपयोग नहीं करते हैं तब तक यह विधियों को संकलित नहीं करता है और आपको हेडर में टेम्पलेट की आवश्यकता होती है। सी # में शीर्षलेख नहीं हैं लेकिन जेनेरिक अभी भी एक डीएल में संकलित होने के बाद भी काम करते हैं
 – 
user34537
22 जून 2011, 00:59
1
@ ओली: यानी, प्रत्येक मान प्रकार के लिए अलग-अलग कार्यान्वयन होंगे और संदर्भ प्रकारों के लिए एक साझा कार्यान्वयन होगा।
 – 
Jeff Mercado
22 जून 2011, 00:59
@ ओडेड: मैं नहीं देखता कि आपके लिंक किसी भी चीज़ का उत्तर कैसे देते हैं ... उनमें से कोई भी जेनेरिक का उल्लेख नहीं करता है
 – 
user34537
22 जून 2011, 01:00

2 जवाब

सबसे बढ़िया उत्तर

जेनेरिक खुले और बंद जेनेरिक प्रकारों की अवधारणा का उपयोग करते हैं: एक पैरामीट्रिज्ड जेनेरिक क्लास डेफिनिशन (यानी List<T>) एक ओपन जेनेरिक प्रकार है, जिसमें रनटाइम आपके कोड में आपके प्रत्येक अलग उपयोग के लिए एक बंद जेनेरिक प्रकार उत्पन्न करता है, अर्थात ए List<int> और List<MyStruct> के लिए अलग प्रकार बनाया गया है - प्रत्येक बंद जेनेरिक प्रकार के लिए T का आकार और प्रकार रन-टाइम पर जाना जाता है।

MSDN से स्पष्टीकरण:

जब एक सामान्य प्रकार या विधि को माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज (एमएसआईएल) में संकलित किया जाता है, तो इसमें मेटाडेटा होता है जो इसे टाइप पैरामीटर के रूप में पहचानता है। एक सामान्य प्रकार के लिए MSIL का उपयोग कैसे किया जाता है, इस पर निर्भर करता है कि आपूर्ति किए गए प्रकार पैरामीटर एक मान प्रकार या संदर्भ प्रकार है या नहीं।

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

संदर्भ प्रकारों के लिए जेनरिक कुछ अलग तरीके से काम करते हैं। किसी भी संदर्भ प्रकार के साथ पहली बार एक सामान्य प्रकार का निर्माण किया जाता है, रनटाइम एमएसआईएल में पैरामीटर के लिए प्रतिस्थापित ऑब्जेक्ट संदर्भों के साथ एक विशेष सामान्य प्रकार बनाता है। फिर, हर बार जब एक निर्मित प्रकार को संदर्भ प्रकार के साथ इसके पैरामीटर के रूप में तत्काल किया जाता है, भले ही वह किस प्रकार का हो, रनटाइम सामान्य प्रकार के पहले बनाए गए विशेष संस्करण का पुन: उपयोग करता है। यह संभव है क्योंकि सभी संदर्भ समान आकार के हैं।

9
BrokenGlass 22 जून 2011, 01:10

सीएलआर जेनेरिक वर्ग के 1 संस्करण को संकलित करता है और सभी संदर्भ प्रकारों के लिए इसका उपयोग करता है। यह प्रदर्शन के लिए अनुकूलित करने के लिए प्रत्येक मूल्य प्रकार के उपयोग के लिए 1 संस्करण भी संकलित करता है।

2
Stilgar 22 जून 2011, 01:00