2010-10-21 17 views
7

मेरी आंत महसूस कहता है कि मैं निम्नलिखित ऐसा नहीं करना चाहिए बदल सकते हैं। मुझे इसके बारे में कोई चेतावनी नहीं मिली है।मैं एक पारित कर दिया विधि पैरामीटर

void test(DateTime d) 
{ 
d = d.AddDays(2); 
//do some thing with d 
} 

या इस अधिक उचित

void test(DateTime d) 
{ 
DateTime _d = d.AddDays(1); 
//do some thing with _d 
} 

किसी कारण मैं हमेशा संभाला है के लिए दूसरे उदाहरण में जैसे पैरामीटर पारित कर दिया है। लेकिन मुझे यकीन नहीं है कि यह वास्तव में नैसेसरी है ... शायद यह सिर्फ अनैतिक कोड है।

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

उत्तर

14

परिवर्तन, फोन करने वाले के लिए अदृश्य है जब तक कि यह एक ref या out पैरामीटर है।

कि नहीं मामला है अगर आप एक संदर्भ प्रकार वस्तु एक पैरामीटर द्वारा करने के लिए भेजा में बदलाव करते हैं। देखा

public void Foo(StringBuilder b) 
{ 
    // Changes the value of the parameter (b) - not seen by caller 
    b = new StringBuilder(); 
} 

public void Bar(StringBuilder b) 
{ 
    // Changes the contents of the StringBuilder referred to by b's value - 
    // this will be seen by the caller 
    b.Append("Hello"); 
} 

अंत में, पैरामीटर संदर्भ द्वारा पारित कर दिया जाता है, परिवर्तन है: उदाहरण के लिए:

public void Baz(ref StringBuilder b) 
{ 
    // This change *will* be seen 
    b = new StringBuilder(); 
} 

इस बारे में अधिक के लिए, मेरे article on parameter passing देखते हैं।

+0

लेख के लिए धन्यवाद ... मैं इसे आज रात अपनी उड़ान पर पढ़ूंगा – Brad

4

आप इसे बदल सकते हैं लेकिन परिवर्तन कॉलर पर वापस नहीं जाएगा।

यदि यह एक ValueType है ->प्रति वस्तु के भेज दिया जाता है

यदि यह एक RefernceType है ->वस्तु संदर्भ की प्रति मूल्य द्वारा भेजा जाएगा। इस तरह वस्तु के गुणों को बदला जा सकता है लेकिन संदर्भ स्वयं नहीं - कॉलर वैसे भी परिवर्तन नहीं देख पाएगा।

यदि यह ref भेजा गया है -> संदर्भ बदला जा सकता है।

सी ++ में आप परिवर्तन को रोकने के लिए const का उपयोग कर सकते हैं लेकिन सी # में ऐसा नहीं है। यह केवल प्रोग्रामर को गलती से रोकने के लिए इसे बदलने की कोशिश करता है - यह निर्भर करता है कि const कहां उपयोग किया जाता है।

+0

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

+0

@ हार्पर: यदि ओपी पैरामीटर के मूल्य से * ऑब्जेक्ट * में निर्दिष्ट * ऑब्जेक्ट में परिवर्तन करने के बजाय पैरामीटर का मान बदलता है। इन दोनों के बीच अंतर के उदाहरण के लिए मेरा जवाब देखें। –

+0

@ हार्पर, 'foo = ...' संरचना या कक्षा के लिए कॉल साइट पर प्रतिबिंबित नहीं होगा * जब तक कि यह विशेष रूप से 'ref' (या' out') पैरामीटर नहीं है। संदर्भ प्रकार * के सदस्यों के लिए आप क्या करते हैं * संदर्भित करेंगे, आप संदर्भ में * क्या करेंगे * नहीं करेंगे। –

0

आप मूल मूल्य का उपयोग कर सकेंगे चाहते हैं, दूसरी विधि का उपयोग करें।

यदि आपको मूल मूल्य की परवाह नहीं है, तो आप या तो एक का उपयोग कर सकते हैं (शायद मैं अभी भी दूसरे का उपयोग करता हूं)।

किसी भी तरह से, आप इस मामले में किसी और के मूल्यों को चोट पहुंचाने वाले नहीं हैं (भले ही आप मूल्य फिर से असाइन करें, यह कॉलर पर वापस नहीं आएगा)। एक पैरामीटर की मूल्य के लिए

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