C# 7.0 ने ref locals और ref returns पेश किए जो रेफरेंस सेमेन्टिक्स के साथ वैल्यू टाइप्स को अधिक कुशलता से संभालने की अनुमति देते हैं।
Ref Locals (रेफरेंस लोकल वेरिएबल्स)
एक ref local वेरिएबल किसी अन्य वेरिएबल का एलियास होता है - वे समान मेमोरी लोकेशन साझा करते हैं।
Ref Local के बिना (वैल्यू कॉपी)
var colors = new[] { "blue", "green", "yellow", "orange", "pink" };
string color = colors[3]; // वैल्यू कॉपी होती है
color = "Magenta"; // केवल लोकल कॉपी बदलती है
// colors[3] अभी भी "orange" है
आउटपुट: blue green yellow orange pink
Ref Local के साथ (रेफरेंस शेयरिंग)
var colors = new[] { "blue", "green", "yellow", "orange", "pink" };
ref string color = ref colors[3]; // रेफरेंस साझा करता है
color = "Magenta"; // मूल ऐरे भी बदल जाता है
आउटपुट: blue green yellow Magenta pink
Ref Returns (रेफरेंस रिटर्न)
एक मेथड वैल्यू के बजाय वेरिएबल का रेफरेंस लौटा सकता है।
सामान्य रिटर्न (वैल्यू द्वारा)
public static string GetColor(string[] col, int index) {
return col[index]; // वैल्यू कॉपी लौटाता है
}
string color = GetColor(colors, 3);
color = "Magenta"; // मूल ऐरे अपरिवर्तित रहता है
Ref Return के साथ
public static ref string GetColor(string[] col, int index) {
return ref col[index]; // रेफरेंस लौटाता है
}
ref string color = ref GetColor(colors, 3);
color = "Magenta"; // मूल ऐरे बदल जाता है
आउटपुट: blue green yellow Magenta pink
महत्वपूर्ण नियम
- Ref return करने वाला मेथड
refकीवर्ड के साथ सिग्नेचर में घोषित होना चाहिए - कॉलर को
refका उपयोग करके रिसीव करना होगा:ref var x = ref Method() - रेफरेंस एक सुरक्षित स्कोप का होना चाहिए (लोकल वेरिएबल्स का रेफरेंस न लौटाएं)
- बड़े स्ट्रक्स के साथ परफॉरमेंस सुधार के लिए उपयोगी
उपयोग के मामले
- बड़े स्ट्रक्स की अनावश्यक कॉपी से बचने के लिए
- ऐरे/कलेक्शन तत्वों को सीधे संशोधित करने के लिए
- हाई-परफॉरमेंस कोड में मेमोरी आवंटन कम करने के लिए