C # के पास और रेफरी दोनों क्यों हैं?


18

C # में कीवर्ड outऔर refकीवर्ड हैं। इन दोनों की आवश्यकता क्यों है? अस्वीकरण: मुझे C # का गहरा ज्ञान नहीं है।


3
क्या स्टैक ओवरफ्लो पर क्रॉस-साइट डुप्लिकेट नहीं है?
पीटर मोर्टेंसन


2
क्या आप refऔर के बीच का अंतर पूछ रहे हैं out? या आप पूछ रहे हैं कि उप-मूल्य तर्क (पैरामीटर के लिए कोई संशोधक) की तुलना में उप-संदर्भ तर्कों ref/ outका उपयोग क्या है ? अथवा दोनों?
जेपी स्टिग नील्सन

1
मुझे लगता है कि यह प्रश्न समान है, लेकिन काफी कठिन नहीं है - कम से कम अगर यह भाषा के डिजाइन के नजरिए से लिया जाए
jmoreno

जवाबों:


32

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


10
कम्प्रेसर के लिए रेफरी आउट आउट कहीं अधिक महत्वपूर्ण है, जितना कि एक प्रोग्रामर के लिए। संकलक यह सुनिश्चित करने के लिए बाध्य है कि आप एक चर नहीं पढ़ते हैं इससे पहले कि यह एक मूल्य निर्धारित किया जाता है, और outयह ऐसा करने का एक तरीका देता है जो बेहतर होता है कि आप पहली जगह में चर से कैसे निपटना चाहते हैं।
Cort Ammon - मोनिका

क्या आप इसके बारे में विस्तार से बता सकते हैं: 'आउट' कुछ ऐसा संचार करता है जो 'रेफ' नहीं करता है।
नव

4
@ नैनो: मूल रूप से मैंने उत्तर में जो कहा है: यह बताता है कि आप इनपुट के लिए इसका उपयोग करने के बारे में परवाह नहीं करते हैं, और इस प्रकार यह एक outपरम के लिए एक अनैतिक मूल्य पारित करने के लिए सुरक्षित है क्योंकि यह प्राप्त करने वाला फ़ंक्शन इसे से पढ़ने नहीं जा रहा है ।
मेसन व्हीलर

@MasonWheeler क्या यह (और / या प्राप्त अंत पर लागू) सत्यापनकर्ता द्वारा अनुमति है, हालांकि? बाहर सिर्फ एक विशेषता है, आंतरिक रूप से।
रैंडम 832

@ Random832: जैसा कि रॉबर्ट ने अपने जवाब के तहत पोस्ट किया है, एरिक लिपर्ट (पूर्व C # संकलक लड़का) पर एक नज़र है, इस पर चर्चा stackoverflow.com/q/2876315
मेसन व्हीलर

7

इन दो खोजशब्दों को समझने के लिए, आपको यह समझने की आवश्यकता होगी कि संदर्भ के माध्यम से किसी मान का क्या अर्थ है। अनिवार्य रूप से इसका मतलब है कि, यदि आप उस पैरामीटर चर को संशोधित करते हैं, जिसे आप विधि या फ़ंक्शन के भीतर पास करते हैं, तो वह चर आपके फ़ंक्शन से बाहर निकलने पर अपने संशोधित मूल्य को बरकरार रखता है। एक पैरामीटर घोषित करना refया outइसे पूरा करना, जबकि एक साधारण पैरामीटर चर अपने मूल मूल्य को बनाए रखेगा, भले ही आपने इसे फ़ंक्शन में संशोधित किया हो।

के बीच अंतर केवल refऔर outवह यह है कि outचर प्रारंभ करने से पहले आप इसे समारोह में पारित की आवश्यकता नहीं है, लेकिन refकरता है, जबकि out करता समारोह के भीतर चर के लिए कुछ आवंटित करने के लिए आप की आवश्यकता होती है, लेकिन refऐसा नहीं करता।


क्या विचरण से संबंधित कोई अंतर नहीं है?
मोनोकेल

पर एरिक Lippert के जवाब देखें stackoverflow.com/q/2876315
रॉबर्ट हार्वे

2

तुम ने पूछा था।

C # बाहर है और रेफरी, इन दोनों की आवश्यकता क्यों है। मुझे C # का गहरा ज्ञान नहीं है। क्यों और रेफरी मापदंडों की आवश्यकता है?

और जवाब है कि वे आवश्यक नहीं हैं, उदाहरण के लिए जावा या तो नहीं है और VB केवल रेफरी है (और केवल विधि घोषणा में इसकी आवश्यकता है)।

आप आसानी से या तो उपयोग किए बिना एक पूरा कार्यक्रम लिख सकते हैं।

वे मौजूद हैं क्योंकि वे कभी-कभी उपयोगी होते हैं। यही कारण है कि उनमें से दो हैं और सिर्फ एक ही नहीं है - क्योंकि 'यहाँ कुछ है, अगर आप चाहते हैं तो इसे संशोधित करें' और 'इस चीज़ को एक नया मूल्य दें' के बीच अंतर करना उपयोगी है।

अन्य भाषाओं की अलग-अलग प्राथमिकताएं हैं और इसलिए इनमें या समतुल्य शामिल हो भी सकती हैं और नहीं भी। वे इस पर भी असहमत हो सकते हैं कि या तो उपयोगी है, और इसलिए सक्रिय रूप से एक या दूसरे को लागू करने का फैसला नहीं कर सकते हैं।


1

अपने मूल में दोनों refऔर outबताए के लिए - एक पद्धति के लिए एक चर के पते गुजर इतना है कि यह अद्यतन किया जा सकता के लिए एक तंत्र प्रदान करते हैं refया outपैरामीटर फोन करने वाले का प्रसंग में चर अद्यतन करता है। जहां वे भिन्न हैं वे गारंटी में हैं: outगारंटी देता है कि चर अपडेट किया जाएगा, refनहीं।

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

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

उपयोग के संदर्भ में: एक सामान्य नियम के रूप में मैं उन outपरिस्थितियों के लिए उपयोग करता हूं जहां मैं चर की सामग्री के बारे में परवाह नहीं करता हूं जब यह एक पैरामीटर के रूप में आता है और refजब मैं करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.