दिलचस्प पोस्ट
पायथन 3 के साथ आईएनआई फाइल कैसे पढ़ा और लिखी? सूची <टी> या आईआईएलआईटी <टी> AngularJS: एनजी मॉडल बाध्यकारी अद्यतन नहीं है जब jQuery के साथ बदल दिया केन के बाद गेटलाइन का उपयोग करना (cin, s) एक फ़ाइल अपलोड करते समय क्यों एनकटीप = मल्टीपार्ट / फ़ॉर्म-डेटा की आवश्यकता होती है? कैसे saveAsTextFile बनाने के लिए एकाधिक फ़ाइल में आउटपुट नहीं विभाजित? PHP में स्क्रिप्ट निष्पादन समय को ट्रैक करना एक बहुभाषी डेटाबेस के लिए स्कीमा क्यों कंपाइलर std :: स्ट्रिंग के अंदर संघ की अनुमति नहीं देता? jQuery के यूआई accordion कि कई वर्गों खुला रहता है? Mongoose.js: यूज़रनेम नाम की मान के आधार पर उपयोगकर्ता खोजें ब्राउज़र को यूआरएल में यूआरएल पर कैसे जाना है? git शाखा, कांटा, फ़ेच, मर्ज, रीबेस और क्लोन, अंतर क्या हैं? मीटोर प्रोजेक्ट में मौजूदा मोंगोडीबी का उपयोग कैसे करूं? SQL में 100 वर्षों के लिए कैलेंडर तालिका कैसे तैयार करें

सी # में संदर्भ-प्रकार चर के लिए "रेफरी" का क्या उपयोग है?

मैं समझता हूं कि यदि मैं एक पैरामीटर ( ref कीवर्ड के बिना) के मान-प्रकार ( int , struct आदि) को पास करता हूं, तो उस वैरिएबल की एक प्रति विधि को पारित कर दिया जाता है, लेकिन अगर मैं ref कीवर्ड का संदर्भ उस संदर्भ में करता हूं वेरिएबल पारित किया गया है, न कि एक नया

लेकिन संदर्भ-प्रकारों के साथ, ref कीवर्ड के बिना वर्गों की तरह भी, एक संदर्भ विधि को पारित किया जाता है, प्रतिलिपि नहीं। तो संदर्भ-प्रकार वाले ref कीवर्ड का क्या उपयोग है?


उदाहरण के लिए:

 var x = new Foo(); 

निम्नलिखित के बीच अंतर क्या है?

 void Bar(Foo y) { y.Name = "2"; } 

तथा

 void Bar(ref Foo y) { y.Name = "2"; } 

वेब के समाधान से एकत्रित समाधान "सी # में संदर्भ-प्रकार चर के लिए "रेफरी" का क्या उपयोग है?"

आप y का उपयोग करने के लिए क्या foo बता सकते हैं:

 Foo foo = new Foo("1"); void Bar(ref Foo y) { y = new Foo("2"); } Bar(ref foo); // foo.Name == "2" 

ऐसी स्थितियां हैं जहां आप वास्तविक संदर्भ को संशोधित करना चाहते हैं, न कि ऑब्जेक्ट को इंगित करना है:

 void Swap<T>(ref T x, ref T y) { T t = x; x = y; y = t; } var test = new[] { "0", "1" }; Swap(ref test[0], ref test[1]); 

जॉन स्कीट ने सी # में पासिंग पैरामीटर के बारे में एक महान लेख लिखा है । यह स्पष्ट रूप से सटीक व्यवहार और मूल्य के आधार पर पैरामीटर का उपयोग, संदर्भ ( ref ), और आउटपुट ( out ) द्वारा निर्दिष्ट करता है।

ref पैरामीटर के संबंध में उस पृष्ठ से यहां एक महत्वपूर्ण उद्धरण है:

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

बहुत अच्छी तरह से समझाया गया है: http://msdn.microsoft.com/en-us/library/s6938f28.aspx

लेख से सार:

एक संदर्भ प्रकार में एक चर इसके डेटा सीधे शामिल नहीं है; इसमें इसके डेटा के संदर्भ हैं जब आप मूल्य से एक संदर्भ-प्रकार पैरामीटर पास करते हैं, तो संदर्भ द्वारा इंगित किए गए डेटा को बदलना संभव होता है, जैसे क्लास सदस्य के मान। हालांकि, आप संदर्भ के मूल्य को स्वयं नहीं बदल सकते हैं; यही है, आप एक नया वर्ग के लिए स्मृति आवंटित करने के लिए एक ही संदर्भ का उपयोग नहीं कर सकते हैं और इसे ब्लॉक के बाहर जारी रहें। ऐसा करने के लिए, रेफरी या आउट कीवर्ड का उपयोग करके पैरामीटर पास करें।

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

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

यह आपको पारित संदर्भ को संशोधित करने की अनुमति देता है उदा

 void Bar() { var y = new Foo(); Baz(ref y); } void Baz(ref Foo y) { y.Name = "2"; // Overwrite the reference y = new Foo(); } 

आप इस बात का भी उपयोग कर सकते हैं कि यदि आपने इस संदर्भ में पारित किया है:

 void Bar() { var y = new Foo(); Baz(out y); } void Baz(out Foo y) { // Return a new reference y = new Foo(); } 

कोड का एक अन्य गुच्छा

 class O { public int prop = 0; } class Program { static void Main(string[] args) { O o1 = new O(); o1.prop = 1; O o2 = new O(); o2.prop = 2; o1modifier(o1); o2modifier(ref o2); Console.WriteLine("1 : " + o1.prop.ToString()); Console.WriteLine("2 : " + o2.prop.ToString()); Console.ReadLine(); } static void o1modifier(O o) { o = new O(); o.prop = 3; } static void o2modifier(ref O o) { o = new O(); o.prop = 4; } } 

मौजूदा उत्तरों के अतिरिक्त:

जैसा कि आपने 2 तरीकों के अंतर के लिए कहा: ref या out का उपयोग करते समय कोई सह (एनटीआर) विचरण नहीं होता out :

 class Foo { } class FooBar : Foo { } static void Bar(Foo foo) { } static void Bar(ref Foo foo) { foo = new Foo(); } void Main() { Foo foo = null; Bar(foo); // OK Bar(ref foo); // OK FooBar fooBar = null; Bar(fooBar); // OK (covariance) Bar(ref fooBar); // compile time error } 

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

मान प्रकार: इंडेंटिफायर (मान = स्टैक मान का पता) —-> मूल्य का मूल्य

संदर्भ प्रकार: पहचानकर्ता (मान = ढेर मूल्य का पता) —-> (मान = हेप मान का पता) —-> हीप मान (अक्सर अन्य मानों के लिए पतों को शामिल किया जाता है), अलग-अलग तीरों की कल्पना करना ऐरे [0], ऐरे [1], सरणी [2] के निर्देश

एक मान बदलने का एकमात्र तरीका तीर का पालन करना है अगर एक तीर खो जाता है / बदल जाता है तो उसमें मूल्य न पहुंचने योग्य है।