क्यों करता है, तो callvirt कॉल के बजाय प्रयोग किया जाता है एक पुनरावर्ती मंगलाचरण ढेर अतिप्रवाह तक होता है?
क्योंकि फिर अपना कोड बिल्कुल के रूप में एक ही है:
override string ToString()
{
return this.ToString();
}
जो स्पष्ट रूप से एक अनंत प्रत्यावर्तन है, बशर्ते कि विधि दिया ToString के सबसे-अधिभावी संस्करण है।
यदि कॉल का उपयोग किया जाता है, तो यह कैसे जांचता है कि यह विधियों को कॉल करने के लिए उपयोग किए जाने वाले आवृत्ति परिवर्तक शून्य है या नहीं?
प्रश्न उत्तरदायी नहीं है क्योंकि सवाल झूठ बोलता है।कॉल निर्देश नहीं यह देखने के लिए जांचें कि रिसीवर का संदर्भ शून्य है या नहीं, इसलिए पूछें कि कॉल निर्देश निर्देश शून्य के लिए क्यों कोई समझ नहीं आता है।
मुझे अलग तरीके से व्यक्त है कि कुछ बेहतर सवाल में आप के लिए करते हैं:
क्या परिस्थितियों में सी # संकलक एक फोन एक callvirt बनाम उत्पन्न करता है?
सी # कोड एक आभासी विधि पर एक गैर आभासी कॉल कर रही है तो संकलक एक फोन है, न कि callvirt उत्पन्न करनी चाहिये। वर्चुअल विधि को कॉल करने के लिए base
का उपयोग करते समय यह वास्तव में होता है।
सी # कोड एक आभासी कॉल कर रही है तो संकलक एक callvirt उत्पन्न करनी चाहिये।
सी # कोड एक गैर आभासी विधि पर एक गैर आभासी कॉल कर रही है तो संकलक उत्पन्न या तो फोन या callvirt चुन सकते हैं। या तो काम करेगा। सी # कंपाइलर आम तौर पर एक कॉलवर्ट उत्पन्न करने का विकल्प चुनता है।
कॉल निर्देश स्वचालित रूप से शून्य जांच नहीं करता है, लेकिन कॉलवर्ट करता है। यदि सी # कंपाइलर कॉलवर्ट की बजाय कॉल उत्पन्न करने का विकल्प चुनता है, तो क्या यह एक शून्य जांच उत्पन्न करने के लिए भी बाध्य है?
नहीं। सी # कंपाइलर शून्य जांच को छोड़ सकता है अगर रिसीवर पहले से ही शून्य नहीं है। उदाहरण के लिए, यदि आपने गैर-वर्चुअल विधि एम के लिए (new C()).M()
कहा है तो संकलक के लिए call
निर्देश उत्पन्न करने के लिए यह कानूनी होगा। हम जानते हैं कि (1) विधि वर्चुअल नहीं है, इसलिए इसे callvirt
होना आवश्यक नहीं है; हम चुन सकते हैं कि callvirt
का उपयोग करना है या नहीं। और हम जानते हैं (2) कि new C()
कभी शून्य नहीं है, इसलिए हमें शून्य जांच उत्पन्न करने की आवश्यकता नहीं है।
यदि सी # कंपाइलर नहीं जानता है कि रिसीवर शून्य नहीं है, तो यह या तो कॉलवर्ट उत्पन्न करेगा, या यह कॉल के बाद एक शून्य जांच उत्पन्न करेगा।
@ लुसेरो: नहीं, मैं इसके बारे में एक किताब पढ़ रहा हूं और जब मुझे पुस्तक में कोई जवाब नहीं मिला तो यह मेरे दिमाग में आया। – Tarik
मेरे पास (मुझे लगता है) मैंने स्पष्ट किया है कि मैं आपका प्रश्न '2' मानता हूं। अगर मैं गलत हूं, तो बस मेरे संशोधन को रोलबैक करें :) – AakashM
@AakashM: वास्तव में यह वही था जो मैं पूछ रहा था, ऐसा लगता है कि 'कॉलवर्ट' यह जांच नहीं करता है कि चर खाली है या नहीं :) – Tarik