पास करें ref
यदि आप बदलना चाहते हैं कि वस्तु क्या है:
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
DoSomething कॉल करने के बाद, t
मूल का उल्लेख नहीं करता है new TestRef
, लेकिन एक पूरी तरह से अलग वस्तु को संदर्भित करता है।
यदि आप किसी अपरिवर्तनीय वस्तु के मूल्य को बदलना चाहते हैं, तो भी यह उपयोगी हो सकता है string
। आपके string
द्वारा बनाए गए एक बार के मूल्य को बदल नहीं सकता है । लेकिन एक का उपयोग करके ref
, आप एक ऐसा फ़ंक्शन बना सकते हैं जो स्ट्रिंग को दूसरे के लिए बदलता है जिसका एक अलग मूल्य है।
संपादित करें: जैसा कि अन्य लोगों ने उल्लेख किया है। ref
जब तक जरूरत न हो इसका इस्तेमाल करना अच्छा नहीं है। उपयोग ref
करने से कुछ और के लिए तर्क को बदलने की विधि स्वतंत्रता मिलती है, इस संभावना को संभालने के लिए विधि के कॉलर को कोडित करने की आवश्यकता होगी।
इसके अलावा, जब पैरामीटर प्रकार एक ऑब्जेक्ट होता है, तो ऑब्जेक्ट चर हमेशा ऑब्जेक्ट के संदर्भ के रूप में कार्य करते हैं। इसका मतलब यह है कि जब ref
कीवर्ड का उपयोग किया जाता है तो आपको एक संदर्भ के लिए एक संदर्भ मिला है। यह आपको ऊपर दिए गए उदाहरण में वर्णित चीजों को करने की अनुमति देता है। लेकिन, जब पैरामीटर प्रकार एक आदिम मूल्य (जैसे int
) है, तो यदि यह पैरामीटर विधि के भीतर सौंपा गया है, तो तर्क का मान जो पास किया गया था, वह विधि रिटर्न के बाद बदल जाएगा:
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}