2013-08-29 9 views
26

मैं वर्तमान में डैनियल एम। सोलिस द्वारा एक पुस्तक पढ़ रहा हूं जिसे "इलस्ट्रेटेड सी # 2010" कहा जाता है। पुस्तक का कहना है:"कॉल" और "आमंत्रण" के बीच क्या अंतर है?

"एक विधि जब कहा जाता है या शुरू हो जाती है ..."

इन दो शब्दों के बीच क्या अंतर है?

+1

जहां तक ​​मुझे पता है कि एक विधि को कॉल करना सामान्य है: 'विधि (पैराम्स);' और एक विधि का आह्वान करना सिर्फ एक अलग थ्रेड से कॉल करना है। –

+0

http://social.msdn.microsoft.com/Forums/en-US/f629c34d-6523-433a-90b3-bb5d445c5587/differences-between-delegate-invoke-and-call-a-method- प्रत्यक्ष रूप से - http://stackoverflow.com/a/7907079/2027232 –

उत्तर

20

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

Invoke आमतौर पर यूआई कोड में उपयोग किया जाता है। यूआई कोड में विंडोज का एक मौलिक नियम यह है कि आप UI को बनाए गए थ्रेड पर केवल यूआई के साथ बातचीत कर सकते हैं। इसलिए यदि आप यूआई के साथ माध्यमिक धागे (जैसे वर्कर थ्रेड) पर बात करना चाहते हैं तो आपको कॉल को सही धागे पर मार्शल करना होगा। ध्यान दें कि यह घटनाओं पर भी लागू होता है। वे वास्तव में विधि आमंत्रण से ज्यादा कुछ नहीं हैं। Control.Invoke विधि जो सभी WinForm नियंत्रणों द्वारा विरासत में मिली है, आपको यूआई थ्रेड पर मनमाने ढंग से विधि कॉल करने की अनुमति देती है। विधि सही धागे के अनुरोध को मार्शल करने की प्रक्रिया को संभालती है और फिर विधि पर आमंत्रण बुलाती है। यह अभी भी देर से बाध्यकारी है, भले ही आप पहले से जानते हों कि आप किस विधि को कॉल करना चाहते हैं।

+3

कभी-कभी एक सामान्य और सीधी कॉल, जैसे 'एम();', को भी एक आमंत्रण कहा जाता है। उदाहरण के लिए [आधिकारिक सी # भाषा विशिष्टता] (http://msdn.microsoft.com/en-us/library/aa691356.aspx) में। –

4

फंक्शन कॉलिंग तब होती है जब आप किसी प्रोग्राम में स्वयं को फ़ंक्शन कहते हैं। जबकि कार्यवाही का कार्य तब होता है जब इसे स्वचालित रूप से बुलाया जाता है।

struct s 
{ 
    int a,b,s; 

    s() 
    { 
    a=2; 
    b=3; 
    } 

    void sum() 
    { 
    s=a+b; 
    } 
}; 

void main() 
{ 
    struct s obj; //line 1 
    obj.sum(); // line 2 
} 

यहाँ, जब लाइन 1 निष्पादित किया जाता है, समारोह (निर्माता है, यानी रों) शुरू हो जाती है:

उदाहरण के लिए, इस कार्यक्रम पर विचार करें। जब लाइन 2 निष्पादित किया जाता है, तो फ़ंक्शन योग कहा जाता है।

स्रोत: वेब

+0

आपका उदाहरण अवैध है। एक 'स्ट्रक्चर' स्पष्ट रूप से पैरामीटर रहित इंस्टेंस कन्स्ट्रक्टर घोषित नहीं कर सकता है। एक फ़ील्ड (या अन्य प्रकार के सदस्य) का नाम समान प्रकार के समान नाम नहीं हो सकता है। 'स्ट्रक्चर' के साथ, सभी इंस्टेंस फ़ील्ड को कन्स्ट्रक्टर छोड़ने से पहले निश्चित रूप से असाइन किया जाना चाहिए। आपके "लाइन 1" में वाक्यविन्यास पूरी तरह से अमान्य है। यह सी # होना चाहिए था। –

+3

@JeppeStigNielsen c'mon man यह कोड पढ़ने के सबूत के लिए नहीं है। यह सिर्फ दो के बीच अंतर को समझने के लिए है। और मुझे उम्मीद है कि ओपी इसे समझ सकता है। –

+0

लेकिन मुझे अंतर समझ में नहीं आता है। क्या 'नई' ऑब्जेक्ट एक्सप्रेशन जैसे 'न्यू मायटाइप (एक्स, वाई); "शब्दावली" आपके शब्दावली में रचनाकारों के हैं? मुझे लगता है कि प्रश्न *** विधियों को आमंत्रित/कॉल करने के बारे में था ***, लेकिन आपकी राय में, रचनाकारों के लिए "आह्वान" और विधियों के लिए उपयोग किए जाने वाले "कॉल" का उपयोग किया जाता है? –

2

विधि Invokation एक शब्द आम तौर पर परोक्ष रूप से, क्योंकि यह सीधे फोन करने में समस्या या परेशानी की एक विधि (समारोह) बुला में संदर्भित है।

समानांतर प्रोग्रामिंग के संदर्भ में उदाहरण के लिए: एक आवेदन अंतरिक्ष के अंदर दो धागे पर विचार करें parallely चल रहे हैं। एक वस्तु aother धागा पर रहने का एक सार्वजनिक विधि कॉलिंग क्रॉस थ्रेड फेंकता Invokation अपवाद क्योंकि दौड़ occure सकता है। समाधान विधि निष्पादित और समानांतर अनुरोधों के प्रबंधन के ऑब्जेक्ट के लिए काम के बाकी उपज करने के लिए वस्तु लागू कर रहा है।

एक और उदाहरण आप कहीं एक विधि के लिए एक प्रतिनिधि की ओर इशारा करते है जब है। जब आप प्रतिनिधि को उस (अज्ञात) विधि को कॉल करने के लिए कहते हैं, तो आप चलाने के लिए विधि को आमंत्रित करते हैं।

1

शायद वह केवल "कॉल" और "invoke" समानार्थी शब्दों को मानता है, और सिर्फ दोनों शब्दों का उल्लेख करना चाहता है क्योंकि जंगली में दोनों शर्तों का सामना हो सकता है। नहीं यह या उस मामले में का उपयोग करना संभव होगा?

3

मेरे शोध से (व्यक्तिगत & अवैतनिक), इन शब्दों का प्रयोग प्रोग्रामिंग साहित्य & "जंगली में" में किया जाता है, मुझे पता चला है कि ये परिभाषाएं उनके उपयोग को फिट करने लगती हैं।

निष्पादन: कोड चलाने की प्रक्रिया को संदर्भित करता है। सटीक विधि कोई फर्क नहीं पड़ता, संकलित या नहीं, कंप्यूटर द्वारा किया जा सकता है या नहीं।

आवेदन/आवेदन: समारोह में तर्कों के बाध्यकारी को संदर्भित करता है। आवेदन आंशिक और पूर्ण दोनों हो सकता है। कार्यात्मक प्रोग्रामिंग दुनिया से, आंशिक अनुप्रयोग कम पैरामीटर के साथ एक और फ़ंक्शन उत्पन्न करता है जबकि पूरा एप्लिकेशन एक थंक उत्पन्न करता है। Thunks कोई पैरामीटर के साथ काम कर रहे हैं और "आलसी मूल्यांकन" के साथ मदद कर सकते हैं।

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

कॉलिंग: कम से कम परिभाषित किया गया है। आम तौर पर फ़ंक्शन को पूरी तरह लागू करने की संयुक्त प्रक्रिया को संदर्भित करता है, फिर आम तौर पर जोड़े गए अर्थात् साथ कि आपका कोड वापसी मूल्य के लिए प्रतीक्षा करेगा।

कृपया यह भी ध्यान दें कि ये सभी शर्तें लिखे गए वर्तमान कोड के बिंदु दृश्य से व्यक्तिपरक हैं। एक आरपीसी कॉल के माध्यम से एक समारोह को आमंत्रित करना केवल ग्राहक के पक्ष से ही इसका आह्वान कर रहा है। सर्वर के पक्ष से अनुरोध में एक अलग आमंत्रण बिंदु होता है, अगर फ़ंक्शन के पास सर्वर के पक्ष में फ़ंक्शन के रूप में कोई भी "अर्थ" होता है।

संबंधित मुद्दे