2011-08-22 19 views
6

मैं Array.cs के लिए स्रोत कोड के माध्यम से जा रहा था, जब मैंने पढ़ा कि Array.Copy() यह गारंटी प्रदान नहीं करता है कि एक प्रति सफल होगी और वास्तव में मूल उदाहरण को दूषित कर सकता है (अगर मुझे सही करें मैं यहाँ गलत हूँ)। मन की शांति प्रदान करने के लिए, ConstrainedCopy() वही प्राप्त करने लगता है।ऐरे। कॉपी और ऐरे। कॉन्स्ट्रेनडॉपी - सी #

मेरा प्रश्न है:
1> क्यों किसी को भी Array.Copy() का प्रयोग करेंगे अगर यह डेटा की एक सफल हस्तांतरण की गारंटी और संभवतः मूल उदाहरण चोट करने के लिए चल रहा प्रतीत नहीं होता है? असल में, सभी संग्रह वर्ग उनके उदाहरण आकार को बढ़ाने के लिए Array.Copy() का उपयोग करते प्रतीत होते हैं। ConstrainedCopy() का उपयोग क्यों न करें

2>ConstrainedCopy() का उपयोग करने की लागत कितनी होगी? मुझे लगता है कि ConstrainedCopy() में और तर्क जोड़ा जाएगा?

उत्तर

4

अवरोधित कॉपी() सफलता की गारंटी नहीं देता है। एमएसडीएन डॉक्स की पहली पंक्ति कहती है:

निर्दिष्ट स्रोत अनुक्रमणिका से शुरू होने वाले ऐरे से तत्वों की एक श्रृंखला की प्रतिलिपि बनाता है और निर्दिष्ट गंतव्य अनुक्रमणिका से शुरू होने वाले अन्य ऐरे को चिपकाता है। गारंटी है कि प्रतिलिपि पूरी तरह सफल नहीं होने पर सभी परिवर्तन पूर्ववत हो जाते हैं।

अधिक विशेष रूप से दूसरी पंक्ति:

गारंटी है कि सभी परिवर्तनों को पूर्ववत कर रहे हैं प्रति पूरी तरह से सफल नहीं होता।

बहुत ही चरम परिस्थितियों में एक अपवाद अभी भी फेंक दिया जा सकता है। हालांकि, ये परिस्थितियां असाधारण हैं और आपको ज्यादातर परिदृश्यों में उनके बारे में चिंता करने की ज़रूरत नहीं है।

संक्षेप में, बस Array.Copy() के साथ चिपके रहें।

+1

क्या आप समझा सकते हैं कि उन चरम परिस्थितियों में क्या अपवाद हो सकते हैं? अन्यथा हम नहीं जान पाएंगे कि हमारा परिदृश्य एक है जहां हमें चिंता करने की ज़रूरत है। – Gabe

+0

टॉच, स्मृति निष्पादन से बाहर की तरह कुछ प्रतिलिपि की विफलता का कारण बन सकता है, इनमें से अधिकतर परिस्थितियां प्रतिलिपि विधि के दायरे से बाहर हैं और आमतौर पर एक बड़ी समस्या का संकेत हैं। – BentOnCoding

+3

प्रतिलिपि शुरू होने से पहले 'कॉपी' विधि से फेंकने वाले अधिकांश अपवाद, इसलिए आपको रेंज या वाईप मेलसमैच से बाहर इंडेक्स से बचाने के लिए 'अवरोधित कॉपी' की आवश्यकता नहीं है। एकमात्र संभावित अपवाद जो मैं सोच सकता हूं कि मध्य-प्रतिलिपि हो सकती है 'अमान्यकास्ट अपवाद' और 'थ्रेडएबॉर्ट अपवाद'। – Gabe

15
Object[] objArray = { "Anakin", "Skywalker", 666 }; 
String[] stringArray = new String[3]; 
  1. Array.Copy(objArray, stringArray , 3);

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

  2. Array.ConstrainedCopy(objArray, 0, stringArray, 0, 3);

    यह एक System.ArrayTypeMismatchException फेंकता है और गंतव्य सरणी (stringArray) करने के लिए किसी भी तत्व को कॉपी नहीं करेंगे।