2010-08-13 9 views
32

क्या मुझे किसी विधि के संदर्भ में सूची चर पारित करने के लिए "रेफरी" का उपयोग करना चाहिए?सी # - क्या मुझे किसी विधि के संदर्भ में संग्रह (उदा। सूची) पास करने के लिए "रेफरी" का उपयोग करना चाहिए?

, जवाब "रेफरी" की जरूरत नहीं है कि (के रूप में सूची एक संदर्भ चर होगा) है पठनीयता में आसानी में "रेफरी" डाल तथापि के लिए?

+0

[ पासिंग रेफरी द्वारा और बाहर] (http://stackoverflow.com/questions/1644372/passing-by-ref-and-out) इसी तरह के मुद्दों को शामिल किया गया। –

उत्तर

22

नहीं, एक रेफरी का उपयोग न करें जबतक कि आप बदलना चाहते हैं कि वेरिएबल किस संदर्भ में संदर्भित है। यदि आप केवल सूची तक पहुंच बनाना चाहते हैं, तो इसे बिना किसी रेफरी के करें।

आप एक पैरामीटर रेफरी बनाने हैं, तो आप कह रहे हैं कि फोन करने वाले की उम्मीद करनी चाहिए कि पैरामीटर वे में पारित किसी अन्य वस्तु को सौंपा जा सकता है। यदि आप ऐसा नहीं कर रहे हैं, तो यह सही जानकारी का संदेश नहीं दे रहा है। आपको यह मानना ​​चाहिए कि सभी सी # डेवलपर्स समझते हैं कि एक ऑब्जेक्ट संदर्भ पारित किया जा रहा है।

8

आपको अपने परिदृश्य में ref की आवश्यकता नहीं है, और न ही यह पठनीयता के साथ मदद करेगा। क्या वैरिएबल संदर्भ, नहीं वस्तु यह संदर्भ देता है की सामग्री को

ref केवल यदि आप बदलने का इरादा किया जाता है। क्या इसका कोई मतलब है?

49

एक शब्दकोश एक संदर्भ प्रकार है, तो यह मान द्वारा पारित करने के लिए संभव नहीं है, हालांकि एक शब्दकोश के लिए संदर्भ मूल्य हैं। मुझे इस स्पष्ट करने के लिए कोशिश करते हैं:

void Method1(Dictionary<string, string> dict) { 
    dict["a"] = "b"; 
    dict = new Dictionary<string, string>(); 
} 

void Method2(ref Dictionary<string, string> dict) { 
    dict["e"] = "f"; 
    dict = new Dictionary<string, string>(); 
} 

public void Main() { 
    var myDict = new Dictionary<string, string>(); 
    myDict["c"] = "d"; 

    Method1(myDict); 
    Console.Write(myDict["a"]); // b 
    Console.Write(myDict["c"]); // d 

    Method2(ref myDict); // replaced with new blank dictionary 
    Console.Write(myDict["a"]); // key runtime error 
    Console.Write(myDict["e"]); // key runtime error 
} 
संबंधित मुद्दे

 संबंधित मुद्दे