c# - प्रारंभिक और देर से बाध्यकारी




binding late-binding (5)

मैं सी # में शुरुआती / देर से बाध्यकारी होने पर अपने सिर को पाने की कोशिश कर रहा हूं।

गैर-वर्चुअल विधियां हमेशा प्रारंभिक बाध्य होती हैं। वर्चुअल विधियां हमेशा देर से बाध्य होती हैं: संकलक निष्पादन समय पर बाध्य करने के लिए वास्तविक विधि को हल करने के लिए अतिरिक्त कोड डालता है और प्रकार सुरक्षा के लिए जांच करता है। तो subtype polymorphism देर से बाध्यकारी का उपयोग करता है।

प्रतिबिंब का उपयोग कर कॉलिंग विधियां देर से बाध्यकारी का एक उदाहरण है। हम संकलक के विरोध में इसे प्राप्त करने के लिए कोड लिखते हैं। (जैसे COM घटकों को कॉल करना।)

विकल्प सख्त बंद होने पर वीबीएनईटी अंतर्निहित देर से बाध्यकारी का समर्थन करता है। ऑब्जेक्ट टाइप करने के लिए घोषित वैरिएबल को असाइन किया जाता है जब एक ऑब्जेक्ट देर से बाध्य होता है। वीबी कंपाइलर निष्पादन समय पर सही विधि से जुड़ने और अमान्य कॉल को पकड़ने के लिए कोड सम्मिलित करता है। सी # इस सुविधा का समर्थन नहीं करता है।

क्या मैं सही दिशा में जा रहा हूं?

प्रतिनिधियों को कॉल करने और एक इंटरफेस संदर्भ के माध्यम से एक विधि बुलाए जाने के बारे में क्या? क्या वह शुरुआती या देर से बाध्यकारी है?


जब तक आप प्रतिबिंब इंटरफ़ेस से गुजरते हैं, तब तक सबकुछ सी # में शुरुआती होता है।

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

देर बाध्य का मतलब है कि रन टाइम पर लक्ष्य विधि देखी जाती है। अक्सर विधि के पाठ का नाम इसे देखने के लिए उपयोग किया जाता है। यदि विधि वहां नहीं है, तो धमाका। कार्यक्रम रन टाइम पर कुछ अपवाद हैंडलिंग योजना में दुर्घटनाग्रस्त हो जाएगा या जाएगा।

अधिकांश स्क्रिप्ट भाषा देर से बाध्यकारी का उपयोग करती हैं, और संकलित भाषाएं प्रारंभिक बाध्यकारी का उपयोग करती हैं।

सी # (संस्करण 4 से पहले) देर से बांध नहीं है; हालांकि वे इसे करने के लिए प्रतिबिंब एपीआई का उपयोग कर सकते हैं। वह एपीआई उस कोड को संकलित करता है जो रन टाइम पर असेंबली के माध्यम से खुदाई करके फ़ंक्शन नाम देखता है। विकल्प सख्त बंद होने पर वीबी देर से बांध सकता है।

बाध्यकारी आमतौर पर प्रदर्शन पर प्रभाव पड़ता है। चूंकि देर से बाध्यकारी को रनटाइम पर लुकअप की आवश्यकता होती है, आमतौर पर इसका मतलब है कि प्रारंभिक बाध्य विधि कॉल की तुलना में विधि कॉल धीमी होती है।

एक सामान्य कार्य के लिए, संकलक स्मृति में इसके सांख्यिक स्थान को काम कर सकता है। फिर जब इसे फ़ंक्शन कहा जाता है तो यह इस पते पर फ़ंक्शन को कॉल करने के लिए निर्देश उत्पन्न कर सकता है।

किसी ऑब्जेक्ट के लिए जिसमें कोई आभासी विधियां हैं, संकलक एक v-table उत्पन्न करेगा। यह अनिवार्य रूप से एक सरणी है जिसमें वर्चुअल विधियों के पते शामिल हैं। वर्चुअल विधि वाले प्रत्येक ऑब्जेक्ट में कंपाइलर द्वारा उत्पन्न एक छिपी सदस्य होगा जो v-table का पता है। जब वर्चुअल फ़ंक्शन कहा जाता है, तो संकलक काम करेगा कि स्थिति v-table में उचित विधि का क्या है। इसके बाद ऑब्जेक्ट्स v-table में देखने के लिए कोड उत्पन्न होगा और इस स्थिति में वर्चुअल विधि को कॉल करें।

तो, एक लुकअप है जो वर्चुअल फ़ंक्शन के लिए होता है। यह बहुत अनुकूलित है इसलिए यह रन-टाइम पर बहुत जल्दी होगा।

प्रारंभिक बाध्य

  • कंपाइलर काम कर सकता है जहां कहा गया फ़ंक्शन संकलन समय पर होगा।
  • कंपाइलर प्रारंभिक गारंटी दे सकता है (किसी भी प्रोग्राम कोड से पहले) कि फ़ंक्शन मौजूद होगा और रनटाइम पर कॉल करने योग्य होगा।
  • कंपाइलर गारंटी देता है कि फ़ंक्शन तर्कों की सही संख्या लेता है और वे सही प्रकार के हैं। यह भी जांचता है कि वापसी मूल्य सही प्रकार का है।

देर बाध्यकारी

  • लुकअप में अधिक समय लगेगा क्योंकि यह एक साधारण ऑफ़सेट गणना नहीं है, आमतौर पर टेक्स्ट तुलना की जाती है।
  • लक्ष्य कार्य मौजूद नहीं हो सकता है।
  • लक्षित फ़ंक्शन इसे पारित तर्कों को स्वीकार नहीं कर सकता है, और गलत प्रकार का वापसी मूल्य हो सकता है।
  • कुछ कार्यान्वयन के साथ, लक्ष्य विधि वास्तव में रन-टाइम पर बदल सकती है। तो, लुकअप एक अलग फ़ंक्शन निष्पादित कर सकता है। मुझे लगता है कि यह रूबी भाषा में होता है, प्रोग्राम चलाने के दौरान आप ऑब्जेक्ट पर एक नई विधि को परिभाषित कर सकते हैं। लेट-बाइंडिंग मौजूदा बेस विधि को कॉल करने के बजाए एक विधि के लिए एक नया ओवरराइड कॉल करना शुरू करने के लिए फ़ंक्शन कॉल की अनुमति देता है।

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

//Early Binding
**Employee** employeeObject = new **Employee**();
employeeObject.CalculateSalary();

दूसरी ओर, यदि आपके पास संकलन समय पर कक्षा का ज्ञान नहीं है, तो प्रतिबिंब का उपयोग करके देर से बांधने का एकमात्र तरीका है। मैं इन अवधारणाओं को समझाते हुए एक उत्कृष्ट वीडियो में आया हूं - यहां लिंक है


बहुत सरल शब्दों में, प्रारंभिक बाध्यकारी संकलन समय पर होता है और संकलक के प्रकार और उसके सभी सदस्यों के बारे में ज्ञान होता है, और देर से बाध्यकारी रन टाइम पर होता है, संकलक प्रकार और उसके सदस्यों के बारे में कुछ नहीं जानता है। मैं यूट्यूब पर एक उत्कृष्ट वीडियो में आया हूं जो इन अवधारणाओं को समझाता है।

http://www.youtube.com/watch?v=s0eIgl5iqqQ&list=PLAC325451207E3105&index=55&feature=plpp_video

http://www.youtube.com/playlist?list=PLAC325451207E3105


यह आलेख एक .net घटक बनाने के लिए एक गाइड है, इसे देर से बाध्यकारी का उपयोग करके रनटाइम पर एक Vb6 प्रोजेक्ट में उपयोग करके, इसकी घटनाओं को जोड़कर और कॉलबैक प्राप्त करने के लिए।

http://www.codeproject.com/KB/cs/csapivb6callback2.aspx

यह आलेख एक .NET घटक बनाने और VB6 प्रोजेक्ट में इसका उपयोग करने के लिए एक गाइड है। इस मुद्दे के बारे में कई नमूने हैं, तो मैंने एक नया क्यों लिखा? मेरी विनम्र राय में, अन्य लेखों में, गायब हिस्सा रनटाइम पर अपना ईवेंट संलग्न करना है। तो इस आलेख में, हम एक .NET घटक बनायेंगे, इसे COM दृश्य घटक के रूप में चिह्नित करें, इसे VB6 में रनटाइम पर उपयोग करें और इसकी घटनाओं से जुड़ें।

https://www.codeproject.com/Articles/37127/Internet-Explorer-Late-Binding-Automation

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

सबसे आम तरीका shdocvw.dll (माइक्रोसॉफ्ट वेब ब्राउज़र नियंत्रण) और Mshtml.dll (HTML पार्सिंग और रेंडरिंग घटक), या Microsoft.Mshtml.dll का उपयोग करना है जो वास्तव में Mshtml.dll के लिए .NET wrapper है। आप इंटरनेट एक्सप्लोरर के बारे में अधिक जानकारी प्राप्त कर सकते हैं - ब्राउज़र के बारे में यहां।

यदि आप उपर्युक्त विधि और डीएलएल चुनते हैं, तो कृपया उन समस्याओं में से कुछ देखें जिन्हें आप सौदा कर सकते हैं:

आपको इन डीएलएल को वितरित करना होगा क्योंकि आपकी परियोजना इन डीएलएल पर निर्भर होगी, और यदि आप उन्हें सही तरीके से तैनात नहीं कर सकते हैं तो यह एक गंभीर समस्या है। बस shdocvw और mshtml.dll समस्याओं को वितरित करने के बारे में कुछ गूगलिंग करें, और आप देखेंगे कि मैं किस बारे में बात कर रहा हूं। आपको 8 एमबी Microsoft.mshtml.dll को तैनात करना होगा क्योंकि यह डीएलएल .NET ढांचे का हिस्सा नहीं है। इस मामले में, हमें जो करना है वह देर से बाध्यकारी तकनीक का उपयोग करना है। उपर्युक्त डीएलएल के लिए अपने स्वयं के रैपर लिखना। और निश्चित रूप से, हम ऐसा करेंगे क्योंकि यह इन डीएलएल का उपयोग करने से अधिक उपयोगी है। उदाहरण के लिए, हमें यह जांचने की आवश्यकता नहीं होगी कि दस्तावेज़ डाउनलोड ऑपरेशन पूर्ण है या नहीं, क्योंकि आईईहेल्पर हमारे लिए यह करेगा।


सी # 3 प्रारंभिक बाध्यकारी का उपयोग करता है।

सी # 4 dynamic कीवर्ड के साथ देर से बाध्यकारी जोड़ता है। विवरण के लिए विषय पर क्रिस बुरो की ब्लॉग एंट्री देखें।

वर्चुअल बनाम गैर वर्चुअल विधियों के लिए, यह एक अलग मुद्दा है। अगर मैं string.ToString() कॉल करता हूं। string.ToString() , सी # कोड वर्चुअल object.ToString() से जुड़ा हुआ है। object.ToString() विधि। ऑब्जेक्ट के प्रकार के आधार पर कॉलर का कोड बदलता नहीं है। इसके बजाय, वर्चुअल विधियों को फंक्शन पॉइंटर्स की एक तालिका के माध्यम से बुलाया जाता है। ऑब्जेक्ट का एक उदाहरण ऑब्जेक्ट की तालिका को इसके ToString() विधि पर इंगित करता है। स्ट्रिंग के एक उदाहरण में यह वर्चुअल विधि तालिका है जो इसकी ToString() विधि पर इंगित करती है। हाँ, यह बहुरूपता है। लेकिन यह देर से बाध्यकारी नहीं है।





late-binding