2010-04-29 19 views
7

मैं कुछ सी # कोडिंग सीखने की कोशिश कर रहा हूं और सोच रहा हूं कि फ़ंक्शन पॉइंटर्स की सी ++ अवधारणा सी # में शामिल है या नहीं। मुझे लगता है कि प्रतिनिधियों के रूप में ऐसी चीजें हैं। क्या वे एक ही अवधारणा हैं? या वे एक और मौलिक स्तर पर भिन्न हैं?सी # में फ़ंक्शन पॉइंटर्स हैं?

+0

यह भी देखें http://stackoverflow.com/questions/2535516/how-are-delegates-in-c-better-than-function-pointers-in-cc और http://www.codeproject.com/kb /cpp/FastDelegate.aspx। दूसरे लिंक में लेख के लेखक प्रतिनिधियों के ऑब्जेक्ट उन्मुख फ़ंक्शन पॉइंटर्स को मानते हैं। –

+0

संबंधित (और एक दिलचस्प पढ़ा गया): http://stackoverflow.com/questions/7932215/could-the-clr-support-a-function-pointer-value-type – Shog9

उत्तर

15

प्रतिनिधि अनिवार्य रूप से फ़ंक्शन पॉइंटर्स हैं, लेकिन अतिरिक्त मल्टीकास्ट क्षमताओं के साथ निर्मित हैं। इसलिए आप एक ही प्रतिनिधि को कई फ़ंक्शन असाइन कर सकते हैं, और जब प्रतिनिधि को बुलाया जाता है तो उन्हें सभी अनुक्रम में बुलाया जाएगा।

प्रतिनिधि भी अंतर्निहित अतुल्यकालिक इंटरफेस है, और जब एक प्रतिनिधि के लिए नए कार्यों बताए (और, .NET 4 में, जब चारों ओर प्रतिनिधियों गुजर)

+0

हम्म, अनुक्रमिक प्रक्रियाएं। क्या किसी दिए गए प्रतिनिधि को जोड़ने वाले कई धागे के साथ समस्याएं हैं ताकि निष्पादन का आदेश सुसंगत न हो? – yamspog

+0

प्रतिनिधि अपरिवर्तनीय हैं - एक दूसरे के साथ संयोजन (जो आप एक विधि जोड़ते समय करते हैं) एक नया प्रतिनिधि वस्तु देता है और मूल को छूता है। तो वे स्वाभाविक रूप से थ्रेड-सुरक्षित हैं। – thecoop

2

एक प्रतिनिधि एक समारोह के समान है सह/विपरीत विचरण है कुछ तरीकों से सूचक, लेकिन वास्तव में यह एक इंटरफ़ेस के करीब है जिसमें हैंडलर और मल्टीकास्ट प्रेषण तंत्र को पंजीकृत करने के तरीके के साथ संयुक्त केवल एक फ़ंक्शन है।

तो यह फ़ंक्शन पॉइंटर से बहुत अधिक है।

4

शास्त्रीय सी/सी ++ भावना में नहीं, नहीं। लेकिन अवधारणा कुछ हद तक समान है - .NET delegates की अवधारणा को उन स्थितियों को संभालने के लिए प्रस्तुत करती है जहां आपको एक विधि को आमंत्रित करने के लिए एक चर की आवश्यकता होती है। प्रतिनिधियों को पॉइंटर्स के रूप में "twiddled" नहीं किया जा सकता है और प्रकार की सुरक्षा अंतर्निहित है।

यदि आप सी-स्टाइल फ़ंक्शन पॉइंटर्स का उपयोग "सही ढंग से" करते हैं तो अवधारणाएं समान होती हैं। लेकिन ऐसा लगता है कि बहुत सारे विरासत कोड हैं जो पॉइंटर्स के मजेदार मैनिप्लेशंस टाइप-सुरक्षा या क्या नहीं करते हैं।

16

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

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

हालांकि, चूंकि अवधारणा सीएलआर में मौजूद है, यह सैद्धांतिक रूप से संभव है कि सी # का भविष्य संस्करण असुरक्षित कोड में डेटा पॉइंटर्स का समर्थन करने के साथ ही असुरक्षित कोड में प्रथम श्रेणी की अवधारणा के रूप में फ़ंक्शन पॉइंटर्स का समर्थन कर सकता है। हम उस मामले में क्या करेंगे (1) पॉइंटर प्रकार के हस्ताक्षर को पॉइंटर प्रकार के रूप में ट्रैक करें, और (2) "कॉलि" (पॉइंटर इंडिकेशन के माध्यम से कॉल करें) सीआईएल ओपोड का उपयोग करने वाले कोड को उत्सर्जित करें।

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

हालांकि, अगर मैं आप थे तो मैं उस सुविधा के लिए अपनी सांस का इंतजार नहीं करूँगा। हमने इसे प्रोटोटाइप किया है और यह काफी अच्छी तरह से काम करता है, लेकिन मुझे नहीं लगता कि मांग इस समय सी # जैसी सामान्य प्रयोजन भाषा में जोड़ने की गारंटी देने के लिए है।

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