2009-08-18 10 views
6

संभव डुप्लिकेट का उपयोग कर सी # संदर्भ द्वारा मूल्य और पासिंग द्वारा पासिंग के बीच अलग है:
What’s the difference between a parameter passed by reference vs. passed by value?क्या

मैं कठिनाई मूल्य से गुजर के बीच अंतर को समझने और संदर्भ से गुजर रहा है। क्या कोई अंतर दिखाने वाला सी # उदाहरण प्रदान कर सकता है?

+3

डुप्लिकेट http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-reference-vs-passed-by-value –

+2

यह * एक प्रकार का डुप्लिकेट है, लेकिन यह विशेष रूप से सी # उदाहरणों के लिए पूछता है - जबकि संदर्भित प्रश्न में कोई सी # उदाहरण नहीं हैं। बहुत अच्छी * सामान्य * चर्चा, निश्चित रूप से, लेकिन मुझे नहीं लगता कि यह वास्तव में भाषा-विशिष्ट लोगों के लिए भी दर्द होता है। –

+0

@ जोन स्कीट: मौजूदा प्रश्न में सी # सिंटैक्स के साथ उत्तर देने का सही समाधान नहीं है? संभवतः एक मौजूदा उत्तर को संपादित करना। – dmckee

उत्तर

16

सामान्य रूप से, my article about parameter passing पढ़ें।

मूल विचार है: तर्क संदर्भ द्वारा पारित कर दिया है

है, तो विधि के भीतर पैरामीटर मान में परिवर्तन के रूप में अच्छी तरह से तर्क को प्रभावित करेगा।

सूक्ष्म हिस्सा है कि पैरामीटर एक संदर्भ प्रकार है, तो कर रही है अगर:

someParameter.SomeProperty = "New Value"; 

है नहीं पैरामीटर का मान बदल रहा है। पैरामीटर सिर्फ एक संदर्भ है, और उपर्युक्त पैरामीटर को संदर्भित करता है, केवल वस्तु के भीतर डेटा को बदलता नहीं है।

someParameter = new ParameterType(); 
अब उदाहरण के लिए

:: यहाँ पैरामीटर का मान बदल रहा सही मायने में का एक उदाहरण है

सरल उदाहरण: रेफरी द्वारा या मूल्य

class Test 
{ 
    static void Main() 
    { 
     int i = 10; 
     PassByRef(ref i); 
     // Now i is 20 
     PassByValue(i); 
     // i is *still* 20 
    } 

    static void PassByRef(ref int x) 
    { 
     x = 20; 
    } 

    static void PassByValue(int x) 
    { 
     x = 50; 
    } 
} 

अधिक जटिल से एक पूर्णांक गुजर उदाहरण: संदर्भ प्रकारों का उपयोग

class Test 
{ 
    static void Main() 
    { 
     StringBuilder builder = new StringBuilder(); 
     PassByRef(ref builder); 
     // builder now refers to the StringBuilder 
     // constructed in PassByRef 

     PassByValueChangeContents(builder); 
     // builder still refers to the same StringBuilder 
     // but then contents has changed 

     PassByValueChangeParameter(builder); 
     // builder still refers to the same StringBuilder, 
     // not the new one created in PassByValueChangeParameter 
    } 

    static void PassByRef(ref StringBuilder x) 
    { 
     x = new StringBuilder("Created in PassByRef"); 
    } 

    static void PassByValueChangeContents(StringBuilder x) 
    { 
     x.Append(" ... and changed in PassByValueChangeContents"); 
    } 

    static void PassByValueChangeParameter(StringBuilder x) 
    { 
     // This new object won't be "seen" by the caller 
     x = new StringBuilder("Created in PassByValueChangeParameter"); 
    } 
} 
5

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

संदर्भ द्वारा उत्तीर्ण करने का अर्थ है मूल का संदर्भ पारित किया गया है और संदर्भ में परिवर्तन मूल को प्रभावित करते हैं।

यह सी # के लिए विशिष्ट नहीं है, यह कई भाषाओं में मौजूद है।

0

डाइजेस्ट है:

संदर्भ द्वारा पासिंग जब आप समारोह/विधि अपने चर को संशोधित करने की उम्मीद प्रयोग किया जाता है।

जब आप नहीं करते हैं तो मूल्य से गुजरना।