2009-05-08 19 views
7

जब मैंने सी # का उपयोग करना शुरू किया, तो मुझे इस बात का अनिश्चितता नहीं था कि संदर्भों का वास्तव में इलाज कैसे किया गया था (चाहे वे मूल्य आदि द्वारा पारित किए जा रहे हों)। मैंने गलत तरीके से सोचा था कि ऑब्जेक्ट पास करते समय 'रेफरी' कीवर्ड की आवश्यकता होती है जिसे कॉल विधि द्वारा संशोधित किया जाएगा।'ref' कीवर्ड और ऐपडोमेन्स

फिर this जैसे धागे पढ़ने के बाद, मुझे एहसास हुआ कि 'रेफ' केवल तभी आवश्यक था जब आपको वास्तविक संदर्भ/सूचक स्वयं को बदलने की आवश्यकता हो।

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

मैंने नेट की खोज की है और केवल single page मिल सकती है जो इसे संक्षेप में चर्चा करती है। क्या यह ज्ञात मुद्दा है और क्या कोई इसके बारे में कुछ दस्तावेज इंगित करने में सक्षम है? ऐसा लगता है कि मुझे किसी भी पैरामीटर के लिए रेफरी का उपयोग करना होगा जिसे रिमोटिंग कॉल के माध्यम से संशोधित किया जा रहा है।

उत्तर

4

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

+2

मुझे पूरा यकीन है कि एसओएपी (एएसएमएक्स) और डब्ल्यूसीएफ दोनों वेब सेवाएं दोनों दिशाओं में मार्शल करके, "रेफरी" को संभालने में सक्षम होंगी। –

1

मुझे आश्चर्य है कि आपने "संदर्भ/सूचक" क्यों कहा? उन शर्तों के बीच एक बड़ा अंतर है। देखें, एक सूचक सिर्फ एक पता है, एक int कहते हैं।

दूसरी तरफ, संदर्भ कुछ भी नहीं बल्कि उपनाम के अलावा कुछ भी है। सी के ++ दृष्टि में:

int x; 
int& y = x; 

यहाँ पर, जो कुछ भी, एक्स के लिए होता y और viceversa के लिए होता से, वे "हमेशा के लिए" बाध्य कर रहे हैं।

फिर

, सी ++ में, एक पास-दर-रेफरी:

void foo(int& y); 
int main(){ 
    int x = 0; 
    foo(x); 
} 

इसका मतलब है कि y, foo के दायरे के भीतर एक्स के लिए सिर्फ एक और नाम (उपनाम) है। यह सी # में रेफरी का मतलब है।

+0

इसका मतलब है कि इसका मतलब है, लेकिन यह नहीं है क्या संदर्भ का मतलब है। मुझे लगता है कि मिश्रण में सी ++ शुरू करना चीजों को भ्रमित करता है, क्योंकि सी ++ संदर्भ वास्तव में सी # संदर्भ के समान नहीं है। –

+0

मैंने हाइलाइट करने के लिए केवल 'संदर्भ' से 'संदर्भ/सूचक' कहा था कि मैं वास्तविक संदर्भ के बारे में बात कर रहा था, न कि ऑब्जेक्ट संदर्भ संदर्भ रहा था। सोचा था कि यह लोगों को वाक्य को दोबारा पढ़ने से बचाने में मदद कर सकता है। – LegendLength

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