होती है जब delegate
कीवर्ड सी # में उपयोग किया जाता है, सी # कंपाइलर स्वचालित रूप से System.MulticastDelegate
कक्षा से व्युत्पन्न कक्षा उत्पन्न करता है।प्रतिनिधि कीवर्ड के लिए कंपाइलर जेनरेटेड सीलबंद क्लास में आभासी विधियां
इस कंपाइलर जेनरेट क्लास में 3 विधियां भी हैं: Invoke, BeginInvoke and EndInvoke
।
इन तीनों तरीकों को public virtual extern
चिह्नित किया गया है लेकिन दिलचस्प रूप से कक्षा को sealed
चिह्नित किया गया है।
एक सीलबंद कक्षा में परिभाषित वर्चुअल विधियां न केवल प्रतिद्वंद्वी के रूप में आती हैं बल्कि वास्तव में सी # में अवैध होती हैं।
तो मेरा सवाल यह है कि क्या इसका कोई विशिष्ट कारण है या क्या यह उन कुछ हानिकारक चीजों में से एक है जो कुछ अनुमानित भविष्य में वृद्धि को ध्यान में रखते हुए किया जाता है?
संपादित करें 1:
कारण के रूप में 'कॉल' के लिए इतना है कि प्रतिनिधि वस्तु हमेशा CLR से अशक्त के लिए चेक किया गया है तीन में से किसी को निष्पादित करने के प्रयास करने से पहले विरोध किया 'callVirt' आईएल opcode के उपयोग कराने के लिए किया जा सकता है तरीकों? हालांकि मैं यह देखने में असफल रहा कि delegate
इस संबंध में एक विशेष मामला क्यों होना चाहिए।
इसके अलावा यह एक प्रदर्शन हिट (हालांकि यह मामूली हो सकता है) callvirt
का उपयोग कराने के लिए
संपादित 2 नहीं है:
जोड़ा गया सीआईएल टैग, यह पता चला है के रूप में है कि प्रतिनिधियों को परिभाषित करने के सी # तरीका वास्तव में सीआईएल मानक द्वारा अनिवार्य है। मानक राज्यों (निम्नलिखित पूर्ण पाठ नहीं है)
प्रतिनिधियों के पास मूल प्रकार का सिस्टम होगा। डिलीगेट। प्रतिनिधियों को घोषित किया जाएगा सील, और केवल प्रतिनिधि ही या तो निर्दिष्ट पहले दो या सभी चार विधियां हैं। ये विधियों को रनटाइम घोषित किया जाएगा और प्रबंधित किया जाएगा। उनके पास शरीर नहीं होगा, क्योंकि वह निकाय VES द्वारा स्वचालित रूप से बनाया जाएगा। अन्य प्रतिनिधियों पर उपलब्ध विधियों को कक्षा सिस्टम से विरासत में मिला है। बेस क्लास लाइब्रेरी में डिलीगेट करें। प्रतिनिधि तरीके हैं:
- उदाहरण निर्माता
- आह्वान विधि होगी आभासी
- BeginInvoke विधि, वर्तमान है, किया जाएगा आभासी
- EndInvoke विधि आभासी किया जाएगा
तो यह निश्चित रूप से संकलक प्रक्रिया का दुष्प्रभाव नहीं है या अन्य रोचक कंपाइलर आउटपुट के समान है।
यदि मानक कुछ पर जोर देता है, तो यह कुछ अच्छे कारण और तर्क के लिए होना चाहिए।
तो अब सवाल यह है कि प्रतिनिधियों के लिए सीआईएल मानक एक ही समय में मुहरबंद और आभासी पर जोर क्यों देता है?के बाद से है कि शरीर वीईएस द्वारा स्वचालित रूप से बनाया किया जाएगा
, पकड़ यहाँ झूठ ?:
वे एक शरीर नहीं होगा करता है।
क्या वे आभासी चिह्नित हैं ताकि वीईएस/सीएलआर उत्पन्न शरीर को इन तरीकों के आविष्कार पर निष्पादित किया जा सके?
भूलें, सी # में मान्य नहीं है आईएल में पूरी तरह से मान्य हो सकता है - वर्तमान में इसके अन्य उदाहरण भी हैं, यह संभवतः एक और है। लेकिन दिलचस्प खोज के लिए +1। –
मैंने कोशिश की कि ILDasm और ओवरराइड कीवर्ड के साथ आईएल में आभासी में अनुवाद किया गया है। – MBen
@MBen हां लेकिन सी # जेनरेटेड प्रतिनिधि वर्ग के लिए ओवरराइड करने के लिए कोई संबंधित बेस क्लास विधियां नहीं हैं। इसलिए यहां वर्चुअल कीवर्ड 'ओवरराइड' का नतीजा नहीं है :) –