क्या सरणियाँ या सूचियाँ डिफ़ॉल्ट रूप से c # के संदर्भ में उत्तीर्ण होती हैं?


84

क्या वे? या अपने कार्यक्रम को गति देने के लिए क्या मुझे उन्हें संदर्भ से पारित करना चाहिए?


35
अपने कार्यक्रम को तेज करने के लिए आपको (1) सार्थक लक्ष्य निर्धारित करने चाहिए, (2) यह देखने के लिए परीक्षण करें कि क्या आप अपने लक्ष्यों को पूरा कर चुके हैं, (3) यदि आप नहीं करते हैं, तो सबसे धीमी चीज को खोजने के लिए प्रोफाइलिंग टूल का उपयोग करें, और (4) ) सबसे धीमी चीज का अनुकूलन करें।
एरिक लिपर्ट

1

3
@EricLippert आपकी टिप्पणी ओपी के असली सवाल का जवाब किसी भी पोस्ट किए गए उत्तर से कहीं बेहतर है। हर कोई "मूल्य द्वारा पास संदर्भ" तकनीकीताओं से इतना विचलित था कि उन्होंने प्रदर्शन अनुकूलन के बारे में असली सवाल को पूरी तरह से अनदेखा कर दिया। दुर्भाग्य से ओपी ने अपनी जरूरतों को खराब तरीके से बताया, और अन्य उत्तर कम से कम Google भीड़ की मदद करेंगे।
डेन बेचर

"अन्य उत्तर कम से कम Google भीड़ की मदद करेंगे" - वे करेंगे! :)
miki

जवाबों:


208

संदर्भ पारित हो जाता है मूल्य से

.NET में एरर्स ढेर पर ऑब्जेक्ट हैं, इसलिए आपके पास एक संदर्भ है। उस संदर्भ को मूल्य द्वारा पारित किया जाता है, जिसका अर्थ है कि सरणी की सामग्री में परिवर्तन कॉलर द्वारा देखा जाएगा, लेकिन सरणी को पुन: असाइन करना नहीं होगा:

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}

यदि आप refसंशोधक जोड़ते हैं , तो संदर्भ को संदर्भ द्वारा पारित किया जाता है - और कॉल करने वाले को या तो ऊपर परिवर्तन दिखाई देगा।


28
उत्तर सही है, लेकिन मुझे ऐसे लोगों से घृणा है, जो कहते हैं कि "संदर्भ मूल्य द्वारा पारित किया गया है"। यह मुद्दे को भ्रमित करता है। हां, संदर्भ (मेमोरी एड्रेस) मूल्य द्वारा पारित किए जाते हैं लेकिन यह सवाल नहीं था।
वर्नरवा

9
@WernerVA मुझे कोई दिलचस्पी आप कैसे लगता है कि आप इसे दूसरे तरीके से कि अवशेष व्यक्त होता हूँ को सही और स्पष्ट
मार्क Gravell

2
मैं अलग तरीके से व्यक्त नहीं कर सकता, बस शायद थोड़ा और अधिक विस्तार के साथ।
वर्नरवा

यह प्रश्न के गति भाग का उत्तर नहीं देता है। यह संभवतः आपके लिए स्पष्ट है कि एक संदर्भ प्रतिलिपि का अनुकूलन करना सैकड़ों अन्य महंगे ऑपरेशनों की तुलना में पूरी तरह से नगण्य होने वाला है, लेकिन ओपी ने यह विशेष रूप से पूछा है।
डेन बेचर

7
@ गति भाग स्वाभाविक रूप से "अगर सरणी मान द्वारा पारित किया जाता है - अर्थ सरणी सामग्री की एक प्रति - जो एक आवंटन और सभी मेमोरी की एक प्रति है" से जुड़ा हुआ है। चूंकि यह एक संदर्भ है जो पारित हो गया है, इसलिए उत्तर देने के लिए कोई प्रदर्शन सवाल नहीं है - सवाल के उस हिस्से को म्यूट किया गया है और स्वचालित रूप से उत्तर दिया गया है। सिवाय अब यह भी यहाँ स्पष्ट रूप से टिप्पणी में उत्तर दिया जाता है ...
मार्क Gravell

9

वे मूल्य द्वारा पारित कर रहे हैं (जैसा कि सभी मापदंडों है कि न तो रेफरी और न ही बाहर कर रहे हैं), लेकिन मूल्य है ताकि वे प्रभावी ढंग से संदर्भ द्वारा पारित कर रहे हैं, ऑब्जेक्ट के संदर्भ।


0

हां, वे C # में डिफ़ॉल्ट रूप से संदर्भ द्वारा पारित किए जाते हैं। C # में सभी ऑब्जेक्ट्स, वैल्यू टाइप्स को छोड़कर। थोड़ा और अधिक सटीक होने के लिए, वे "मूल्य से संदर्भ द्वारा" पारित किए जाते हैं; यह है, चर है कि आप अपने तरीकों में देखते हैं कि मूल वस्तु पारित संदर्भ का एक संदर्भ है। यह एक छोटा शब्दार्थ बिंदु है, लेकिन ऐसा कभी-कभी महत्वपूर्ण हो सकता है।


9
संदर्भ मूल्य द्वारा पारित किया गया है; जो "संदर्भ द्वारा पारित किया जाता है" के लिए बहुत अलग है।
मार्क ग्रेवेल

1
यह सच्चाई के बिल्कुल विपरीत है। जॉन स्कीट के इस पोस्ट को उद्धृत करते हुए : "डिफ़ॉल्ट रूप से, सभी पैरामीटर C # में मान द्वारा पारित किए जाते हैं। पैरामीटर केवल संदर्भ द्वारा पारित किए जाते हैं यदि आप स्पष्ट रूप से एक आउट या रेफ मॉडिफ़ायर शामिल करते हैं। हालांकि, आपको यह पता होना चाहिए कि पैरामीटर का प्रकार कब है। एक संदर्भ प्रकार है, आप एक वास्तविक वस्तु के बजाय एक संदर्भ पारित कर रहे हैं "। यह केवल संदर्भ (स्मृति पता) है जो मूल्य द्वारा पारित किया गया है।
अलेक्सलोमा87
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.