मैं एक स्पष्टीकरण में अपना हाथ आज़माने जा रहा हूँ:
मुझे लगता है कि हम समझते हैं कि मूल्य प्रकार सही कैसे काम करते हैं? मान प्रकार हैं (इंट, लॉन्ग, स्ट्रक्चर इत्यादि)। जब आप उन्हें रेफरी के बिना किसी फ़ंक्शन में भेजते हैं तो यह डेटा को कॉपी करता है । फ़ंक्शन में उस डेटा के लिए कुछ भी करना केवल कॉपी को प्रभावित करता है, मूल को नहीं। रेफरी कमांड ACTUAL डेटा भेजता है और कोई भी परिवर्तन फ़ंक्शन के बाहर डेटा को प्रभावित करेगा।
भ्रामक भाग पर ठीक है, संदर्भ प्रकार:
एक संदर्भ प्रकार बनाएं:
List<string> someobject = new List<string>()
जब आप someobject को नया करते हैं , तो दो भाग बनते हैं:
- मेमोरी का वह ब्लॉक जो किसी अवस्थिति के लिए डेटा रखता है ।
- डेटा के उस ब्लॉक में एक संदर्भ (पॉइंटर)।
अब आप में भेज जब someobject यह रेफरी प्रतियां बिना एक विधि में संदर्भ सूचक, नहीं डेटा। तो अब आपके पास यह है:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
एक ही वस्तु की ओर इशारा करते हुए दो संदर्भ। यदि आप रेफरेंस 2 का उपयोग करके किसी प्रॉपर्टी को संशोधित करते हैं तो यह रेफरेंस 1 द्वारा बताए गए उसी डेटा को प्रभावित करेगा।
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
यदि आप संदर्भ 2 को शून्य करते हैं या इसे नए डेटा पर इंगित करते हैं तो यह संदर्भ 1 को प्रभावित नहीं करेगा और न ही डेटा संदर्भ 1 को इंगित करता है।
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
अब क्या होता है जब आप किसी विधि द्वारा रेफ्यूज को भेजते हैं ? वास्तविक संदर्भ को someobject विधि करने के लिए भेजा जाता है। तो अब आपके पास डेटा का केवल एक संदर्भ है:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
लेकिन इसका क्या मतलब है? यह बिल्कुल वैसा ही काम करता है जैसे कोई दो बिंदुओं को छोड़कर रेफ द्वारा नहीं भेजा जाता है:
1) जब आप मेथड के अंदर के रेफरेंस को शून्य कर देते हैं, तो यह मेथड के बाहर वाले को शून्य कर देगा।
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) अब आप एक पूरी तरह से अलग डेटा स्थान के संदर्भ को इंगित कर सकते हैं और फ़ंक्शन के बाहर का संदर्भ अब नए डेटा स्थान को इंगित करेगा।
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
MyClassएकclassप्रकार होगा, अर्थात एक संदर्भ प्रकार। उस स्थिति में, आपके द्वारा पास की गई वस्तुmyFunctionको बिनाref/outकीवर्ड के भी संशोधित किया जा सकता है ।myFunctionएक नया संदर्भ प्राप्त करेगा जो एक ही वस्तु को इंगित करता है , और यह उसी वस्तु को संशोधित कर सकता है जितना वह चाहता है। जितना अंतरrefकीवर्ड करेगा, उसे उतने ही ऑब्जेक्ट के लिए एक ही संदर्भmyFunctionप्राप्त होगा । यह तभी महत्वपूर्ण होगा जब किसी अन्य वस्तु को इंगित करने के लिए संदर्भ को बदल दिया जाए ।myFunction