2010-08-18 14 views
7

मुझे समझ में परेशानी हो रही है कि सी # में सरणी क्यों हैं और इस कॉन्वर्सिस को क्या लाभ हो सकता है।सी # सरणी क्यों हैं और यह क्या लाभ लाता है?

object[] myArray = new string[1]; 
myArray[0] = 1; 

इस कोड को ठीक संकलन होगा, लेकिन unceremoniously और शायद आश्चर्य कार्यावधि में विस्फोट हो जाएगा: निम्नलिखित तुच्छ कोड उदाहरण पर विचार करें।

यदि मैं जेनिक्स का उपयोग करके इसी चीज का प्रयास करने की कोशिश करता हूं, तो संकलक मेरे ऊपर घबराएगा और मुझे शुरुआती चरण में मेरी मूर्खता का एहसास होगा, इसलिए मेरा सवाल यह है: सी # कंपाइलर इस कॉन्वर्सिस को सरणी के साथ क्यों अनुमति देता है और इसके अलावा , संभावित लाभ क्या हैं?

उत्तर

12

Eric Lippert कहते हैं:

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

4

एरिक Lippert इस बारे में एक writeup

http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx

और कुछ और दिलचस्प उत्पाद (वास्तव में 'विचरण', 11 भागों मुझे लगता है कि के बारे में एक लंबी श्रृंखला) है

http://blogs.msdn.com/b/ericlippert/archive/2009/09/24/why-is-covariance-of-value-typed-arrays-inconsistent.aspx

+3

mquander ब्लॉग को उद्धृत करने के बजाय ब्लॉग को उद्धृत करने के लिए जीतता है। –

+1

@ जोन बी - और _relevant_ बिट उद्धृत करने के लिए। – Oded

+0

अतिरिक्त जानकारी के लिंक के लिए धन्यवाद। बहुत उपयोगी। – nukefusion

1

ऐसी कई स्थितियां हैं जिनमें कोड स्थानांतरित हो जाएगा या किसी सरणी के स्लॉट के बीच आइटम कॉपी करेगा। बशर्ते कि Arr कम से कम दो तत्वों वाला एक एकल-आयामी सरणी है, तो निम्न कोड Arr या उसमें निहित तत्वों के प्रकार के बावजूद काम करेगा।

Object temp = Arr[1]; 
Arr[1] = Arr[0]; 
Arr[0] = temp; 

इस कोड को अगर Arr एक मूल्य के प्रकार है, लेकिन temp के बाद से सरणी से बाहर पढ़ने के लिए है अक्षम हो जाएगा, सरणी के प्रकार के इस तरह के एक मूल्य धारण करने में सक्षम होने की गारंटी है। कोड को बॉक्स और अनबॉक्स मूल्य-प्रकार तत्वों को रखना होगा, और इस प्रकार इस तरह के प्रकार से अक्षम होंगे, लेकिन यह परवाह किए बिना काम करेगा।

ध्यान दें कि सरणी बनाने के दौरान सरणीकरण विधियों जैसे मनमाने ढंग से सरणी प्रकारों पर काम करने की अनुमति देने का एक तरीका है, यह केवल एकमात्र नहीं है। एक अन्य दृष्टिकोण System.Array में कुछ विधियों और गुणों को शामिल करना होगा जिनके मानकों के अंतर्निहित तत्व प्रकार से कोई संबंध नहीं है। उदाहरण के लिए, इसमें Swap, CopyItem, और Roll, और सूचकांक की सूची दी गई अधिक जटिल क्रमिकताओं को करने के लिए संभवतः कुछ सरल विधियां शामिल हो सकती हैं। ध्यान दें कि ऊपर दिखाए गए कोड के विपरीत, Int[] जैसे प्रकार को Swap विधि को इस तरह के फैशन में ओवरराइड कर सकते हैं ताकि मुक्केबाजी और अनबॉक्सिंग से बच सकें।

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